如何在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))