【问题标题】:Prediction Components in R Linear RegressionR 线性回归中的预测分量
【发布时间】:2015-09-03 21:50:07
【问题描述】:

我想知道如何从predict(..., type = 'term) 获取实际组件。我知道如果我采用rowSums 并将attr(,"constant") 值添加到每个值,我将得到预测值,但我不确定attr(,"constant") 如何在列之间拆分。总而言之,如何改变predict返回的矩阵,让每个值代表模型系数乘以预测数据。结果应该是与predict 返回的维度相同的矩阵(或data.frame),但rowSums 会自动添加到预测值,无需进一步更改。

注意:我意识到我可以将模型产生的系数和矩阵乘以我的预测矩阵,但我宁愿不这样做以避免因素可能产生的任何问题。

编辑:这个问题的目标不是产生一种对行求和以获得预测值的方法,这只是作为一个健全性检查。

如果我有方程 y = 2*a + 3*b + c 并且我的预测值为 500,我想知道 2*a 是什么,3*b 是什么,以及 c 在那个特定点是什么.现在我觉得predict 返回了这些值,但它们已经被缩放了。我需要知道如何取消缩放它们。

【问题讨论】:

  • 当您缩放预测值时唯一会改变的是截距......系数不会改变。我已经在答案中说过了
  • 那我不明白为什么这些值不匹配。当您使用线性模型进行预测时,您只需将系数乘以值,但这不是返回的结果。
  • 是否在没有截距的情况下拟合了模型,然后预测的项没有给出你想要的?
  • 哦,我知道这确实给了我想要的东西。有没有办法在不重新拟合模型的情况下将原始矩阵转换为这个新矩阵?我的代码适合一堆模型,我不想在没有拦截的情况下重新调整它们。
  • 我不这么认为,因为它们是不同的模型。你可能想看看这个答案stats.stackexchange.com/questions/7948/…

标签: r lm predict


【解决方案1】:

它没有在列之间拆分 - 它对应于截距。如果您在模型中包含一个截距,那么它就是预测的平均值。例如,

## With intercept
fit <- lm(Sepal.Length ~ Sepal.Width + Species, data=iris)
tt <- predict(fit, type="terms")
pp <- predict(fit)
attr(tt, "constant")
# [1] 5.843333
attr(scale(pp, scale=F), "scaled:center")
# [1] 5.843333
## or
mean(pp)
# [1] 5.843333

如果您制作没有截距的模型,则不会有常数,因此您将拥有一个矩阵,其中rowSums 对应于预测。

## Without intercept
fit1 <- lm(Sepal.Length ~ Sepal.Width + Species - 1, data=iris)
tt1 <- predict(fit1, type="terms")
attr(tt1, "constant")
# [1] 0

all.equal(rowSums(tt1), predict(fit1))
## [1] TRUE

通过对预测变量进行缩放(减去均值),只改变截距,所以当没有截距时,不进行缩放。

fit2 <- lm(scale(Sepal.Length, scale=F) ~ Sepal.Width + Species, data=iris)
all.equal(coef(fit2)[-1], coef(fit)[-1])
## [1] TRUE

【讨论】:

  • 谢谢,但我意识到了这一切。我所追求的可以用你的例子来解释。 iris 中的第一个 Sepal.Width 值为 3.5。在您的模型中,Sepal.Width 的系数为 0.8036。因此,我想更改 tt 中 Sepal.Width 列的第一个值,使其等于 .8036 * 3.5 = 2.8126。这个值目前是 .3557,我的问题是要问 .3557 和 2.8126 是如何相关的,以及在给定另一个的情况下如何计算一个。
【解决方案2】:

据我所知,常量被设置为属性以节省内存,如果您希望 rowSums 计算正确的预测值,那么您要么需要创建包含常量的额外列,要么只需将常量添加到 rowSums 的输出. (请参阅下面不必要的冗长示例)

rowSums_lm <- function(A){
   if(!is.matrix(A) || is.null(attr(A, "constant"))){
          stop("Input must be a matrix with a 'constant' attribute")
   }
   rowSums(A) + attr(A, "constant")
}

【讨论】:

  • 谢谢,但正如我在问题的第二句中提到的那样,我已经知道这一点。我想知道如何使矩阵中的每个值对应于模型系数乘以预测值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2021-02-27
相关资源
最近更新 更多