如何在r中的数据帧中的不同行组上训练回归模型

如何在r中的数据帧中的不同行组上训练回归模型,r,dataframe,regression,data-science,R,Dataframe,Regression,Data Science,我有以下数据框: id total_transfered_amount day 1 1000 2 1 2000 3 1 3000 4 2 1000 1 2 3000 4 2 5000 3 3 1000

我有以下数据框:

id   total_transfered_amount day
 1       1000                 2
 1       2000                 3
 1       3000                 4
 2       1000                 1
 2       3000                 4
 2       5000                 3
 3       1000                 4
 3       2000                 2
 3       3000                 3
 4       1000                 1
 4       2000                 2
 4       3000                 3
我需要为按id分组的每组行训练回归模型 例如:

model_id_1=lm(day~total_transfered_amount)
model_id_2=lm(day~total_transfered_amount)
model_id_n=lm(day~total_transfered_amount)
如何将lm应用于具有相同id的一组数据,并将其放入模型中?然后再通过另一个
id
,对另一组行执行此操作


我可以使用
apply
family吗?如果是,怎么做?或者
dplyr
能在这种情况下帮助我吗?

一种方法是按id分割数据帧,并
lappy
回归公式

list1 <- split(df, df$id)
lapply(list1, function(i)lm(i$day ~ i$total_transfered_amount))

最直接的方法是利用nlme软件包中的lmList功能:

library(nlme)
models_id <- lmList(day ~ total_transfered_amount| id, df)

models_id
Call:
  Model: day ~ total_transfered_amount | id 
   Data: df 

Coefficients:
  (Intercept) total_transfered_amount
1    1.000000                   1e-03
2    1.166667                   5e-04
3    4.000000                  -5e-04
4    0.000000                   1e-03

Degrees of freedom: 12 total; 4 residual
Residual standard error: 1.020621
库(nlme)

模型_id为了增加一个替代方案,我建议走这条路线:

library(dplyr)
library(broom)

df %>% group_by(id) %>% do(tidy(lm(day~ total_transfered_amount, data=.)))
在这里,我只使用
dplyr
的分组操作来运行
id
的线性回归。这将为您提供一个以系数作为输出的数据帧。见:

> df %>% group_by(id) %>% do(tidy(lm(day~ total_transfered_amount, data=.)))
Source: local data frame [8 x 6]
Groups: id [4]

     id                    term  estimate    std.error  statistic   p.value
  (dbl)                   (chr)     (dbl)        (dbl)      (dbl)     (dbl)
1     1             (Intercept)  1.000000 0.0000000000        Inf 0.0000000
2     1 total_transfered_amount  0.001000 0.0000000000        Inf 0.0000000
3     2             (Intercept)  1.166667 1.9720265944  0.5916080 0.6599011
4     2 total_transfered_amount  0.000500 0.0005773503  0.8660254 0.5456289
5     3             (Intercept)  4.000000 1.8708286934  2.1380899 0.2785092
6     3 total_transfered_amount -0.000500 0.0008660254 -0.5773503 0.6666667
7     4             (Intercept)  0.000000 0.0000000000        NaN       NaN
8     4 total_transfered_amount  0.001000 0.0000000000        Inf 0.0000000

请注意,
Inf
NaN
是因为您发布的数据在
id
的1和4的因变量和解释变量之间具有完美的1:1关系而产生的。有趣的是,与
nlme::lmList
选项相比,您可以在这里看到这一点。您还可以查看
broom::tidy
的选项以添加例如置信区间等。

如果您希望使用dplyr,您可以这样做

df <- data.frame(id = c(1,1,1,2,2,2,3,3,3,4,4,4), total_transfered_amount = c(1000,2000,3000,1000,3000,5000,1000,2000,3000,1000,2000,3000), day=c(2,3,4,1,4,3,4,2,3,1,2,3))
result <-df %>% group_by(id) %>% do (model = lm(.$day ~.$total_transfered_amount))
df%do(型号=lm(.$day~.$total_transfered_amount))

@akrun非常感谢您的支持help@DatamineR我很感激你的帮助help@mra68我很感谢你的帮助,效率够高吗?因为这个数据帧随着时间越来越大。另一方面,我需要将系数和截距存储在数据帧中id@sanaz,您可以尝试使用
数据。表
看起来我们两人同时键入了答案!厄运!这正是我想要的,没错,我的数据非常适合。如果是真实数据集,是否也可以将交叉验证加入此解决方案?如果是真实数据集,是否也可以将交叉验证加入此解决方案?交叉验证是什么意思?lmList中的对象返回为4个独立lm模型的列表,可在软件包中执行的命令之上提取这些模型进行单独预测(例如,使用
coef
汇总所有lm对象的coef,使用
plot.lmList
绘制所有lm模型)@AdamQuek我的意思是:我们如何更改代码以将其拆分为训练集和测试集,并将评估结果包含到输出数据帧中。
fit
df <- data.frame(id = c(1,1,1,2,2,2,3,3,3,4,4,4), total_transfered_amount = c(1000,2000,3000,1000,3000,5000,1000,2000,3000,1000,2000,3000), day=c(2,3,4,1,4,3,4,2,3,1,2,3))
result <-df %>% group_by(id) %>% do (model = lm(.$day ~.$total_transfered_amount))