R线性回归中的预测成分

时间:2015-09-03 21:50:07

标签: r lm predict

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

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

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

如果我有等式y = 2 * a + 3 * b + c且我的预测值是500,我想知道2 * a是什么,3 * b是什么,以及c在那个特定点是什么。现在我觉得这些值是由typeof window !== undefined返回的,但它们已被缩放。我需要知道如何取消它们。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

据我所知,常量被设置为保存内存的属性,如果你想让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")
}