是否可以为Dplyr'中的每个组创建单独的线性模型;让我们总结一下
我有一些这样的数据是否可以为Dplyr'中的每个组创建单独的线性模型;让我们总结一下,r,dplyr,R,Dplyr,我有一些这样的数据 group_name | x | y ------------------ a | 1 | 2 a | 2 | 4 a | 3 | 6 b | 1 | 4 b | 2 | 3 b | 3 | 2 c | 1 | 2 c | 2 | 5 c | 3 | 8 我想按group_名称对它进行分组,并使用Dplyr的sum
group_name | x | y
------------------
a | 1 | 2
a | 2 | 4
a | 3 | 6
b | 1 | 4
b | 2 | 3
b | 3 | 2
c | 1 | 2
c | 2 | 5
c | 3 | 8
我想按group_名称对它进行分组,并使用Dplyr的summary函数为每个组创建一个包含线性模型lm(y~x)的列。有可能吗?如果没有,为每个组创建模型的备选方案是什么
提前感谢您改编以下示例:
编辑:获取预测的一种方法是使用
broom
中的augment
:
library(tidyverse); library(broom)
df %>%
nest(-group_name) %>%
mutate(fit = map(data, ~lm(y ~ x, data = .x)),
predictions = map(fit, augment)) %>%
unnest(predictions)
group_name y x .fitted .se.fit .resid .hat .sigma .rownames .cooksd .std.resid
1 a 2 1 2 0.000000e+00 0.000000e+00 0.8333333 NaN <NA> NA NA
2 a 4 2 4 0.000000e+00 0.000000e+00 0.3333333 NaN <NA> NA NA
3 a 6 3 6 0.000000e+00 0.000000e+00 0.8333333 NaN <NA> NA NA
4 b 4 1 4 6.080942e-16 2.719480e-16 0.8333333 NaN 4 2.50 1
5 b 3 2 3 3.845925e-16 -5.438960e-16 0.3333333 NaN 5 0.25 -1
6 b 2 3 2 6.080942e-16 2.719480e-16 0.8333333 Inf 6 2.50 1
7 c 2 1 2 8.107923e-16 -3.625973e-16 0.8333333 NaN 7 2.50 -1
8 c 5 2 5 5.127900e-16 7.251946e-16 0.3333333 NaN 8 0.25 1
9 c 8 3 8 8.107923e-16 -3.625973e-16 0.8333333 Inf 9 2.50 -1
library(tidyverse);图书馆(扫帚)
df%>%
嵌套(-group_name)%%>%
变异(拟合=映射(数据,~lm(y~x,数据=.x)),
预测=映射(拟合、增强))%>%
不耐烦(预测)
组名称y x.fitted.se.fit.resid.hat.sigma.rownames.cooksd.std.resid
1 a 2 1 200.000000 E+00 0.000000 E+00 0.8333333南那那
2 a 4 4 0.000000 E+00 0.000000 E+00 0.3333333南那那
3 a 6 3 6 0.000000 E+00 0.000000 E+00 0.8333333南那那
4 b 4 4 6.080942e-16 2.719480e-16 0.8333333 NaN 4 2.50 1
5B3233.845925e-16-5.438960e-160.3333333NAN50.25-1
6 b 2 3 2 6.080942e-16 2.719480e-16 0.8333333 Inf 6 2.50 1
7 c 2 1 2 8.107923e-16-3.625973e-16 0.8333333 NaN 7 2.50-1
8 c 5 2 5.127900e-16 7.251946e-16 0.3333333南8 0.25 1
9 c 8 8.107923e-16-3.625973e-16 0.8333333 Inf 9 2.50-1
这里有一种方法
我不得不稍微改变你的测试数据,因为我认为存在完美共线性的问题
df因变量:
#> ---------------------------
#>y
#> -----------------------------------------------
#>x1.579*
#> (0.182)
#>
#>常数0.579
#> (0.437)
#>
#> -----------------------------------------------
#>意见3
#>R2 0.987
#>调整后的R2 0.974
#>剩余标准误差0.324(df=1)
#>F统计数据75.000*(df=1;1)
#> ===============================================
#>注:*p===============================================
#>因变量:
#> ---------------------------
#>y
#> -----------------------------------------------
#>x-0.923
#> (0.266)
#>
#>常数5.000*
#> (0.620)
#>
#> -----------------------------------------------
#>意见3
#>R2 0.923
#>调整后的R2 0.846
#>剩余标准误差0.392(df=1)
#>F统计12.000(df=1;1)
#> ===============================================
#>注:*p===============================================
#>因变量:
#> ---------------------------
#>y
#> -----------------------------------------------
#>x 2.368*
#> (0.273)
#>
#>常数-0.132
#> (0.656)
#>
#> -----------------------------------------------
#>意见3
#>R2 0.987
#>调整后的R2 0.974
#>剩余标准误差0.487(df=1)
#>F统计数据75.000*(df=1;1)
#> ===============================================
#>注:*pYes!现在我看到了布鲁姆的答案,我同意了。当我打字的时候,我还没看到那个答案。谢谢你,先生。当我们在列中有模型时,如何使用predict函数或modeler::add_predictions函数?使用broom::augment
编辑,这比modeler::add_predictions
更为熟悉。
library(tidyverse); library(broom)
df %>%
nest(-group_name) %>%
mutate(fit = map(data, ~lm(y ~ x, data = .x)),
predictions = map(fit, augment)) %>%
unnest(predictions)
group_name y x .fitted .se.fit .resid .hat .sigma .rownames .cooksd .std.resid
1 a 2 1 2 0.000000e+00 0.000000e+00 0.8333333 NaN <NA> NA NA
2 a 4 2 4 0.000000e+00 0.000000e+00 0.3333333 NaN <NA> NA NA
3 a 6 3 6 0.000000e+00 0.000000e+00 0.8333333 NaN <NA> NA NA
4 b 4 1 4 6.080942e-16 2.719480e-16 0.8333333 NaN 4 2.50 1
5 b 3 2 3 3.845925e-16 -5.438960e-16 0.3333333 NaN 5 0.25 -1
6 b 2 3 2 6.080942e-16 2.719480e-16 0.8333333 Inf 6 2.50 1
7 c 2 1 2 8.107923e-16 -3.625973e-16 0.8333333 NaN 7 2.50 -1
8 c 5 2 5 5.127900e-16 7.251946e-16 0.3333333 NaN 8 0.25 1
9 c 8 3 8 8.107923e-16 -3.625973e-16 0.8333333 Inf 9 2.50 -1
#> [1] "group a"
#>
#> ===============================================
#> Dependent variable:
#> ---------------------------
#> y
#> -----------------------------------------------
#> x 1.579*
#> (0.182)
#>
#> Constant 0.579
#> (0.437)
#>
#> -----------------------------------------------
#> Observations 3
#> R2 0.987
#> Adjusted R2 0.974
#> Residual Std. Error 0.324 (df = 1)
#> F Statistic 75.000* (df = 1; 1)
#> ===============================================
#> Note: *p<0.1; **p<0.05; ***p<0.01
#> [1] "group b"
#>
#> ===============================================
#> Dependent variable:
#> ---------------------------
#> y
#> -----------------------------------------------
#> x -0.923
#> (0.266)
#>
#> Constant 5.000*
#> (0.620)
#>
#> -----------------------------------------------
#> Observations 3
#> R2 0.923
#> Adjusted R2 0.846
#> Residual Std. Error 0.392 (df = 1)
#> F Statistic 12.000 (df = 1; 1)
#> ===============================================
#> Note: *p<0.1; **p<0.05; ***p<0.01
#> [1] "group c"
#>
#> ===============================================
#> Dependent variable:
#> ---------------------------
#> y
#> -----------------------------------------------
#> x 2.368*
#> (0.273)
#>
#> Constant -0.132
#> (0.656)
#>
#> -----------------------------------------------
#> Observations 3
#> R2 0.987
#> Adjusted R2 0.974
#> Residual Std. Error 0.487 (df = 1)
#> F Statistic 75.000* (df = 1; 1)
#> ===============================================
#> Note: *p<0.1; **p<0.05; ***p<0.01