在具有线性回归的 data.table 上使用 Predict
Posted
技术标签:
【中文标题】在具有线性回归的 data.table 上使用 Predict【英文标题】:Use Predict on data.table with Linear Regression 【发布时间】:2014-07-19 18:42:37 【问题描述】:Regrad 到这个Post,我创建了一个示例来玩 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】:您每次都在预测整个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 - 这是我第一次设法找到.BY
的用途
@mnel 我是 data.table 的新手。我已经阅读了.BY,但仍然不明白它是如何工作的。你能解释一下吗?
@newbie .BY
在data.table
(?data.table
) 的帮助中有所描述。 .BY
是一个包含 by 变量值的列表。这意味着它可用于与其他键控 data.tables 连接以选择与当前 BY
分组匹配的行。
Andrew ***s 写了 a great article 关于 data.table 特殊符号的用法,包括 .BY。对于那些想要更好地理解这些方法的人来说,这是一本好书。以上是关于在具有线性回归的 data.table 上使用 Predict的主要内容,如果未能解决你的问题,请参考以下文章
如何从回归模型中绘制线性和二次预测变量,同时还要控制其他变量?
如何使用 tensorflow 或 keras 重新训练具有新子集的线性回归模型?