R data.table 按因子循环子集并执行 lm()

标签 r data.table lm

我正在尝试创建一个函数,甚至只是想出如何使用 data.table 语法运行循环,我可以在其中按因子对表进行子集化,在本例中为 id 变量,然后在每个子集上运行线性模型并输出结果.示例数据如下。

df <- data.frame(id = letters[1:3], 
                 cyl = sample(c("a","b","c"), 30, replace = TRUE),
                 factor = sample(c(TRUE, FALSE), 30, replace = TRUE),   
                 hp = sample(c(20:50), 30, replace = TRUE))

dt=as.data.table(df)

fit <- lm(hp ~ cyl + factor, data = df) #how do I get the [i] to work here to subset and iterate by each factor and also do it in data.table syntax?

预期结果类似于 fit[1] 模型、fit[2] 模型等。

最佳答案

我知道你想用数据表来做这个,如果你想要拟合的某些特定方面,比如系数,那么@MartinBel 的方法是一个很好的方法。

另一方面,如果您想自己存储合身,lapply(...)可能是更好的选择:

set.seed(1)
df <- data.frame(id = letters[1:3], 
                 cyl = sample(c("a","b","c"), 30, replace = TRUE),
                 factor = sample(c(TRUE, FALSE), 30, replace = TRUE),   
                 hp = sample(c(20:50), 30, replace = TRUE))
dt <- data.table(df,key="id")

fits <- lapply(unique(df$id),
               function(z)lm(hp~cyl+factor, data=dt[J(z),], y=T))
# coefficients
sapply(fits,coef)
#                   [,1]      [,2]          [,3]
# (Intercept)  44.117647 35.000000  3.933333e+01
# cylb         -6.117647 -6.321429 -1.266667e+01
# cylc        -13.176471  3.821429 -7.833333e+00
# factorTRUE    1.176471  5.535714  2.325797e-15

# predicted values
sapply(fits,predict)
#        [,1]     [,2]     [,3]
# 1  45.29412 28.67857 26.66667
# 2  32.11765 35.00000 31.50000
# 3  30.94118 34.21429 26.66667
# ...

# residuals
sapply(fits,residuals)
#           [,1]        [,2]      [,3]
# 1    2.7058824   0.3214286  7.333333
# 2   -2.1176471   5.0000000 -4.500000
# 3    3.0588235   8.7857143 -4.666667
# ...

# se and r-sq
sapply(fits, function(x)c(se=summary(x)$sigma, rsq=summary(x)$r.squared))
#         [,1]      [,2]      [,3]
# se  7.923655 8.6358196 6.4592741
# rsq 0.463076 0.3069017 0.4957024

# Q-Q plots
par(mfrow=c(1,length(fits)))
lapply(fits,plot,2)



注意使用 key="id"在调用 data.table(...) ,以及使用 if dt[J(z)]对数据表进行子集化。这真的没有必要,除非 dt是巨大的。

关于R data.table 按因子循环子集并执行 lm(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21421396/

相关文章:

r - 如何使用GGPLOT Facet创建4x4散点图

r - 将函数应用于 R 中 gsub 中的反向引用

r - 如何在 data.table 的 j 中正确使用 ifelse()?

r - 使用 data.table 进行左连接

r - 线性回归 - 将预测值附加到同一数据集

r - 使用来自两个不同数据帧的字符向量作为 lm 函数回归的公式

r - 如何免费与同事分享 Shiny 的应用程序?

r - 如何识别 R 中所有列具有相同值的行号?

data.table 中的逐行操作和更新

r - 等效模型的不同 R 平方