【问题标题】:optimal predictor value for multivariate regression in RR中多元回归的最佳预测值
【发布时间】:2014-02-28 04:33:02
【问题描述】:

假设我有 1 个响应变量 Y 和 2 个预测变量 X1 和 X2,如下所示

Y    X1   X2
2.3  1.1  1.2
2.5  1.24 1.17
......

假设我坚信以下模型效果很好

 fit <- lm(Y ~ poly(X1,2) + X2) 

也就是说,Y和X1之间存在二次关系,Y和X2之间存在线性关系。

现在是我的问题:

  1. 如何找到(x1,x2)的最优值,使得拟合模型在这对值处达到最大值?

  2. 现在假设 X2 必须固定在某个特定值,如何找到最优的 x1 以使拟合值最大化?

【问题讨论】:

  • 我看不出它与拟合有什么关系。找到 fit 后,您只想研究它的属性。 1. 你有一个 fit 函数,现在想找到它的最大值。 2. 对于给定的 X2,最大化fit(X1,X2)stats.stackexchange.com/questions/12525/…
  • 我是 R 新手。对象拟合是否为您提供了明确的函数公式?如何最大化这两种情况?谢谢
  • 它返回lm对象stat.ethz.ch/R-manual/R-patched/library/stats/html/lm.html,其中包含变量的系数,请参见此处的一些示例data.princeton.edu/R/linearModels.html
  • @sashkello。是的,我知道我可以使用 summary 来获取 lm 内容,现在的问题是如何获得最佳设置?我拥有统计学硕士学位,所以我确实理解您的链接所说的内容。所以我必须从拟合中显式提取系数并写出公式?谢谢
  • coef(lmfit) 将为您提供一个系数向量,您可以将其乘以 (1, x1, x2) 以获得函数的值。这样你就可以创建一个你想要优化的函数。

标签: r regression statistics


【解决方案1】:

所以这是一种经验方法:

# create some random data...
set.seed(1)
X1 <- 1:100
X2 <- sin(2*pi/100*(1:100))
df <- data.frame(Y=3 + 5*X1 -0.2 * X1^2 + 100*X2 + rnorm(100,0,5),X1,X2)
fit <- lm(Y ~ poly(X1,2,raw=T) + X2, data=df)
# X1 and X2 unconstrained
df$pred <- predict(fit)
result  <- with(df,df[pred==max(pred),])
result
#           Y X1        X2     pred
# 19 122.8838 19 0.9297765 119.2087

# max(Y|X2=0)
newdf       <- data.frame(Y=df$Y, X1=df$X1, X2=0)
newdf$pred2 <- predict(fit,newdata=newdf)
result2     <- with(newdf,newdf[pred2==max(pred2),])
result2
#           Y X1 X2    pred2
#12 104.6039 12  0 35.09141

所以在本例中,当X1X2 不受约束时,Y = 119.2 的最大值出现在(X1,X2) = (122.8,0.930)。当X2 被约束为0 时,Y = 35.1 的最大值出现在(X1,X2) = (104.6,0)

有几点需要考虑:

  1. 这些是数据空间中的全局最大值。换句话说,如果您的真实数据包含大量变量,那么您可能无法通过这种方式找到局部最大值。
  2. 此方法的分辨率仅与您的数据集一样高。因此,如果真正的最大值出现在数据点之间的某个点上,您将不会以这种方式找到它。
  3. 此技术仅限于数据集的范围。因此,如果真正的最大值超出了这些范围,您将找不到它。另一方面,恕我直言,使用超出数据范围的模型是鲁莽的定义。

最后,您应该知道poly(...) 产生正交多项式,这将产生一个拟合,但系数将很难解释。如果您真的想要二次拟合,例如a+ b × x+ c × x2,你最好用Y~X1 +I(X1^2)+X2明确地这样做,或者在对poly(...)的调用中使用raw=T

【讨论】:

  • 当我们不知道它的相对顺序时,在回归对象“fit”中提取变量系数的任何简单方法。例如,“x^2”的系数不知道它的位置
  • 在上面的例子中,你会使用:coefficients(fit)["I(x1^2)"]
  • 我发现我无法使用您建议的方法提取截距系数,其他项系数很好。系数(拟合)[“截距”] => NA
  • 使用:coefficients(fit)["(Intercept)"] 进行拦截。
【解决方案2】:

感谢@sashkello

基本上,我必须从 lm 对象中提取系数并与相应的项相乘以形成公式才能继续。

我认为这不是很有效。如果这是具有数百个预测变量的回归怎么办?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-19
    • 2018-01-13
    • 2015-07-11
    • 2017-04-15
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多