在data.table上使用线性回归的预测功能

7

关于这个帖子,我创建了一个使用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]

返回值,
   group (Intercept)        v1        v2
1:     a    1.374942 -2.151953 -1.355995
2:     b   -2.292529  3.029726 -9.894993

我可以获得lm函数的系数。
我的问题是:如何直接使用predict来预测新观测值?如果我们有以下新观测值:
new <- data.table(group=c("b","b","b","a","a","a"),v1=rnorm(6),v2=rnorm(6))

我已经尝试过:

setkey(new, group)
DT[,predict(lm(y~v1+v2), new), by = group]

但它却给我返回了奇怪的答案:

    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

谢谢你。
1个回答

11

每次你在整个new数据集上进行预测。如果你想仅预测每个组的新数据,需要按组对“newdata”进行子集划分。

这是一个可以使用.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]

两者都会产生相同的结果。

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

好的,我知道那就是问题所在,只是不知道如何解决。.BY对我来说是新的。 - thelatemail
@thelatemail - 这是我第一次找到可以使用 .BY 的地方。 - mnel
@mnel 我是data.table的新手。我已经阅读了.BY,但仍然不明白它是如何工作的。你能解释一下吗? - newbie
@newbie .BYdata.table 的帮助文档 (?data.table) 中有描述。.BY 是一个包含按照变量分组的值的列表。这意味着它可以用于与其他键控数据表连接,以选择与当前 BY 分组匹配的行。 - mnel
1
Andrew Brooks写了一篇关于data.table特殊符号使用的优秀文章,其中包括.BY。对于那些想更好地理解这些方法的人来说,这是一篇很好的阅读材料。 - altabq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接