使用线性回归对data.table进行预测

new*_*bie 5 r predict lm data.table

重新发布到这篇文章,我创建了一个在data.table包上进行线性回归的例子,如下所示:

## rm(list=ls()) # anti-social
library(data.table)
set.seed(1011)
DT = data.table(group=c("b","b","b","a","a","a"),
                v1=rnorm(6),v2=rnorm(6), y=rnorm(6))
setkey(DT, group)
ans <- DT[,as.list(coef(lm(y~v1+v2))), by = group]
Run Code Online (Sandbox Code Playgroud)

返回,

   group (Intercept)        v1        v2
1:     a    1.374942 -2.151953 -1.355995
2:     b   -2.292529  3.029726 -9.894993
Run Code Online (Sandbox Code Playgroud)

我能够获得lm函数的系数.

我的问题是: 我们如何直接用于predict新的观察?如果我们有新的观察结果如下:

new <- data.table(group=c("b","b","b","a","a","a"),v1=rnorm(6),v2=rnorm(6))
Run Code Online (Sandbox Code Playgroud)

我试过了:

setkey(new, group)
DT[,predict(lm(y~v1+v2), new), by = group]
Run Code Online (Sandbox Code Playgroud)

但它给我带来了奇怪的答案:

    group         V1
 1:     a  -2.525502
 2:     a   3.319445
 3:     a   4.340253
 4:     a   3.512047
 5:     a   2.928245
 6:     a   1.368679
 7:     b  -1.835744
 8:     b  -3.465325
 9:     b  19.984160
10:     b -14.588933
11:     b  11.280766
12:     b  -1.132324
Run Code Online (Sandbox Code Playgroud)

谢谢

mne*_*nel 7

new每次都在预测整个数据集.如果您只想预测每个组的新数据,则需要按组对"新数据"进行子集化.

这是一个.BY有用的实例.这有两种可能性

a <- DT[,predict(lm(y ~ v1 + v2), new[.BY]), by = group]

b <- new[,predict(lm(y ~ v1 + v2, data = DT[.BY]), newdata=.SD),by = group]
Run Code Online (Sandbox Code Playgroud)

两者都给出相同的结果

identical(a,b)
# [1] TRUE
a
#   group         V1
#1:     a  -2.525502
#2:     a   3.319445
#3:     a   4.340253
#4:     b -14.588933
#5:     b  11.280766
#6:     b  -1.132324
Run Code Online (Sandbox Code Playgroud)