【问题标题】:Use Predict on data.table with Linear Regression在具有线性回归的 data.table 上使用 Predict
【发布时间】: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

谢谢

【问题讨论】:

    标签: r data.table lm predict


    【解决方案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 .BYdata.table (?data.table) 的帮助中有所描述。 .BY 是一个包含 by 变量值的列表。这意味着它可用于与其他键控 data.tables 连接以选择与当前 BY 分组匹配的行。
    • Andrew Brooks 写了 a great article 关于 data.table 特殊符号的用法,包括 .BY。对于那些想要更好地理解这些方法的人来说,这是一本好书。
    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2015-01-24
    相关资源
    最近更新 更多