R 如何在一个循环中适应多个交互模型?
假设我有3个响应变量A、C和M,我想为所有可能的模型拟合一个模型,即拟合Y~A、Y~C、Y~M、Y~A*C、Y~A*M、Y~C*M等。有没有一种快速的方法可以做到这一点,而无需每次手动指定交互 我不想写R 如何在一个循环中适应多个交互模型?,r,model,glm,model-fitting,R,Model,Glm,Model Fitting,假设我有3个响应变量A、C和M,我想为所有可能的模型拟合一个模型,即拟合Y~A、Y~C、Y~M、Y~A*C、Y~A*M、Y~C*M等。有没有一种快速的方法可以做到这一点,而无需每次手动指定交互 我不想写 M1 = glm(Y ~ A , data = subs, family = "poisson") M2 = glm(Y ~ C , data = subs, family = "poisson") M3 = glm(Y ~ M , data = subs
M1 = glm(Y ~ A , data = subs, family = "poisson")
M2 = glm(Y ~ C , data = subs, family = "poisson")
M3 = glm(Y ~ M , data = subs, family = "poisson")
M4 = glm(Y ~ A*C , data = subs, family = "poisson")
...
事实上,我有3个以上的变量,并希望某种循环,这是可能的。
感谢将所有RHS变量放入
v
ector,并使用combn
获得一个和两个变量的组合(使用lappy
)。我们通过重新格式化
和粘贴
得到的公式会随着*
折叠。在combn
之后,我们需要另一个lappy
来循环组合
v <- c("X1", "X2", "X3")
res <- lapply(1:2, function(n) {
.env <- environment()
cb <- combn(c("X1", "X2", "X3"), n, function(x) paste(x, collapse=" * "))
lapply(cb, function(cb) lm(reformulate(cb, "y", env=.env), dat))
})
数据:
dat这里是一种函数式编程方法。
您可以创建数据,只要您的Y
是第一列,该代码将获取所有其余变量(无论有多少)并根据它们的组合构建模型
v <- c("X1", "X2", "X3")
res <- lapply(1:2, function(n) {
.env <- environment()
cb <- combn(c("X1", "X2", "X3"), n, function(x) paste(x, collapse=" * "))
lapply(cb, function(cb) lm(reformulate(cb, "y", env=.env), dat))
})
最后,由于您已经在这个框架中完成了这项工作,因此可以调用broom的tidy
和confint\u tidy
将结果提取到易于筛选的数据集中
DF <- data_frame(Y = rpois(100, 5),
A = rnorm(100),
C = rnorm(100),
M = rnorm(100))
formula_frame <- bind_rows(data_frame(V1 = names(DF[,-1])),
as_data_frame(t(combn(names(DF[,-1]),2)))) %>%
rowwise() %>%
mutate(formula_text = paste0("Y ~", if_else(is.na(V2),
V1,
paste(V1,V2, sep = "*"))),
formula_obj = list(as.formula(formula_text))) %>%
ungroup()
formula_frame %>%
mutate(fits = map(formula_obj, ~glm(.x, family = "poisson", data = DF) %>%
(function(X)bind_cols(broom::tidy(X),broom::confint_tidy((X)))))) %>%
unnest(fits) %>%
select(-formula_obj)
DF%
变异(公式_text=paste0(“Y~”,如果_else是.na(V2),
V1,
粘贴(V1、V2、sep=“*”),
公式对象=列表(如公式(公式文本))%>%
解组()
公式\u帧%>%
变异(fits=map(公式_obj,~glm(.x,family=“poisson”,data=DF)%>%
(函数(X)绑定列(扫帚::整洁(X),扫帚::确认整洁((X‘‘‘‘‘‘‘‘))%>%
未测试(拟合)%>%
选择(-formula_obj)
#一个tible:18x10
V1 V2公式\文本项估算标准误差统计p值形态低形态高
1 A NA Y~A(截距)1.63 0.0443 36.8 6.92e-297 1.54 1.72
2 A NA Y~A 0.0268 0.0444 0.602 5.47e-1-0.0603 0.114
3c NA Y~C(截距)1.63 0.0443 36.8 5.52e-296 1.54 1.72
4 C NA Y~C 0.0326 0.0466 0.699 4.84e-1-0.0587 0.124
5米NaY~M(截距)1.63 0.0454 35.8 1.21e-280 1.53 1.71
6mNaY~mM-0.02910.0460-0.6345.26e-1-0.1190.0615
7 A C Y~A*C(截距)1.62 0.0446 36.4 5.64e-290 1.54 1.71
8 A C Y~A*C A 0.00814 0.0459 0.178 8.59e-1-0.0816 0.0982
9 A C Y~A*C C 0.0410 0.0482 0.850 3.96e-1-0.0532 0.136
10 A C Y~A*C A:C 0.0650 0.0474 1.37 1.70e-1-0.0270 0.158
11毫米Y~A*M(截距)1.62 0.0458 35.5 1.21e-275 1.53 1.71
12 A M Y~A*M A 0.0232 0.0451 0.514 6.07e-1-0.0653 0.112
13 A M Y~A*M M-0.0260 0.0464-0.561 5.75e-1-0.116 0.0655
14 A M Y~A*M A:M-0.00498 0.0480-0.104 9.17e-1-0.0992 0.0887
15厘米Y~C*M(截距)1.60 0.0472 34.0 1.09e-253 1.51 1.70
16厘米Y~C*M厘米0.0702 0.0506 1.39 1.65e-1-0.0291 0.169
17厘米Y~C*M米-0.0333 0.0479-0.695 4.87e-1-0.127 0.0611
18厘米Y~C*mc:m0.06520.03771.738.39e-2-0.01020.138
这应该可以:
glmulti::glmulti(
Y = "Y",
xr = c("A", "C", "M"),
data = subs,
filename = "my_results",
family = "poisson"
)
它将创建一个文本文件my_results.txt
,其中包含每个模型的信息
您也可以将它作为一行程序与其他包一起使用,leaps
,bestglm
,可能还有其他包。所有可能的二阶交互?或者你也想要一个*C*M?这种数据挖掘有几个软件包:leaps
,bestglm
,glmulti
我相信都有这个功能。AC、AM、CM和以下的所有订单都很好。我想你误解了@BrianLang的问题<代码>AC
不是有效的右侧。你想要A+C
(无交互项)还是A*C
RHS上变量的顺序无关紧要。对不起,是的,我想要A*C及以下,所以A*C,A+C,A,C
# A tibble: 18 x 10
V1 V2 formula_text term estimate std.error statistic p.value conf.low conf.high
<chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A NA Y ~A (Intercept) 1.63 0.0443 36.8 6.92e-297 1.54 1.72
2 A NA Y ~A A 0.0268 0.0444 0.602 5.47e- 1 -0.0603 0.114
3 C NA Y ~C (Intercept) 1.63 0.0443 36.8 5.52e-296 1.54 1.72
4 C NA Y ~C C 0.0326 0.0466 0.699 4.84e- 1 -0.0587 0.124
5 M NA Y ~M (Intercept) 1.63 0.0454 35.8 1.21e-280 1.53 1.71
6 M NA Y ~M M -0.0291 0.0460 -0.634 5.26e- 1 -0.119 0.0615
7 A C Y ~A*C (Intercept) 1.62 0.0446 36.4 5.64e-290 1.54 1.71
8 A C Y ~A*C A 0.00814 0.0459 0.178 8.59e- 1 -0.0816 0.0982
9 A C Y ~A*C C 0.0410 0.0482 0.850 3.96e- 1 -0.0532 0.136
10 A C Y ~A*C A:C 0.0650 0.0474 1.37 1.70e- 1 -0.0270 0.158
11 A M Y ~A*M (Intercept) 1.62 0.0458 35.5 1.21e-275 1.53 1.71
12 A M Y ~A*M A 0.0232 0.0451 0.514 6.07e- 1 -0.0653 0.112
13 A M Y ~A*M M -0.0260 0.0464 -0.561 5.75e- 1 -0.116 0.0655
14 A M Y ~A*M A:M -0.00498 0.0480 -0.104 9.17e- 1 -0.0992 0.0887
15 C M Y ~C*M (Intercept) 1.60 0.0472 34.0 1.09e-253 1.51 1.70
16 C M Y ~C*M C 0.0702 0.0506 1.39 1.65e- 1 -0.0291 0.169
17 C M Y ~C*M M -0.0333 0.0479 -0.695 4.87e- 1 -0.127 0.0611
18 C M Y ~C*M C:M 0.0652 0.0377 1.73 8.39e- 2 -0.0102 0.138
glmulti::glmulti(
Y = "Y",
xr = c("A", "C", "M"),
data = subs,
filename = "my_results",
family = "poisson"
)