我想知道如何从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
返回的,但它们已被缩放。我需要知道如何取消它们。
答案 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")
}