R 如何在一个循环中适应多个交互模型?

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

假设我有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, 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"
)