首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R循环回归

R循环回归
EN

Stack Overflow用户
提问于 2019-10-02 20:07:34
回答 2查看 67关注 0票数 1
代码语言:javascript
运行
复制
data=mtcars
data$group = rep(seq(from=1, to=4, by=1), 8)


model1 <- glm(vs ~ mpg + cyl + disp + hp, data = subset(data, group == 1), family = "binomial")
model2 <- glm(vs ~ mpg + cyl + disp + hp, data = subset(data, group == 2), family = "binomial")
model3 <- glm(vs ~ mpg + cyl + disp + hp, data = subset(data, group == 3), family = "binomial")
model4 <- glm(vs ~ mpg + cyl + disp + hp, data = subset(data, group == 4), family = "binomial")

model5 <- glm(am ~ mpg + cyl + disp + hp, data = subset(data, group == 1), family = "binomial")
model6 <- glm(am ~ mpg + cyl + disp + hp, data = subset(data, group == 2), family = "binomial")
model7 <- glm(am ~ mpg + cyl + disp + hp, data = subset(data, group == 3), family = "binomial")
model8 <- glm(am ~ mpg + cyl + disp + hp, data = subset(data, group == 4), family = "binomial")

假设您想要估计一组分层模型,这些模型在除分层组(模型1-4)之外的所有方面都是相同的,并且您还希望针对不同的结果重复这一系列模型(模型5-8)。

这就是我为上面的代码准备的。然而,有没有一种更有效的方式来运行它,因为它不占用那么多行代码?例如,指定协变量、结果和组,然后循环它们?

EN

回答 2

Stack Overflow用户

发布于 2019-10-02 20:24:41

例如,可以使用data.table按组运行模型管接头,例如:

代码语言:javascript
运行
复制
library(data.table)
dt = as.data.table(data)

models = dt[, .(fit_vs = list(glm(vs ~ mpg + cyl + disp + hp, family = "binomial")),
                fit_am = list(glm(am ~ mpg + cyl + disp + hp, family = "binomial"))), 
            by = .(group)]

结果是:

代码语言:javascript
运行
复制
print(models)
#    group fit_vs fit_am
# 1:     2  <glm>  <glm>
# 2:     1  <glm>  <glm>
# 3:     3  <glm>  <glm>
# 4:     4  <glm>  <glm>

您可以使用以下命令访问适用于vs和组3的fit:

代码语言:javascript
运行
复制
models[group == "3", fit_vs]
# [[1]]
# 
# Call:  glm(formula = vs ~ mpg + cyl + disp + hp, family = "binomial")
# 
# Coefficients:
#   (Intercept)          mpg          cyl         disp           hp  
# 180.970664    -0.384760   -24.366394    -0.008435    -0.010799  
# 
# Degrees of Freedom: 9 Total (i.e. Null);  5 Residual
# Null Deviance:        13.46 
# Residual Deviance: 3.967e-10  AIC: 10
票数 6
EN

Stack Overflow用户

发布于 2019-10-02 20:45:45

首先,seq(from=1, to=4, length=T)返回1,所以您的代码只创建了一个组。因此,我修改了您的代码,如下所示。

代码语言:javascript
运行
复制
data=mtcars
data$group = rep(1:4, each = 8)

我们可以使用这些函数将glm应用于每个组合,如下所示。

代码语言:javascript
运行
复制
library(tidyverse)

data2 <- data %>%
  gather(Y, Value, vs, am) %>%
  group_split(Y, group) %>%
  set_names(nm = map_chr(., ~str_c(unique(.x$Y), unique(.x$group), sep = "-"))) %>%
  map(~glm(Value ~ mpg + cyl + disp + hp, data = .x, family = "binomial"))

我们可以按名称访问结果

代码语言:javascript
运行
复制
data2[["am-1"]]
# Call:  glm(formula = Value ~ mpg + cyl + disp + hp, family = "binomial", 
#            data = .x)
# 
# Coefficients:
# (Intercept)          mpg          cyl         disp           hp  
#     4.9180      -0.5335      17.2521      -0.7975       0.5192  
# 
# Degrees of Freedom: 7 Total (i.e. Null);  3 Residual
# Null Deviance:        10.59 
# Residual Deviance: 2.266e-10  AIC: 10

data3 <- data %>%
  gather(Y, Value, vs, am) %>%
  group_by(Y, group) %>%
  nest() %>%
  mutate(Model = map(data, ~glm(Value ~ mpg + cyl + disp + hp, data = .x, family = "binomial")))
data3
# # A tibble: 8 x 4
# # Groups:   group, Y [8]
#   group Y                data Model 
#   <int> <chr> <list<df[,10]>> <list>
# 1     1 vs           [8 x 10] <glm> 
# 2     2 vs           [8 x 10] <glm> 
# 3     3 vs           [8 x 10] <glm> 
# 4     4 vs           [8 x 10] <glm> 
# 5     1 am           [8 x 10] <glm> 
# 6     2 am           [8 x 10] <glm> 
# 7     3 am           [8 x 10] <glm> 
# 8     4 am           [8 x 10] <glm> 

data3 %>%
  filter(group == 1, Y == "am") %>%
  pull(Model)
# [[1]]
# 
# Call:  glm(formula = Value ~ mpg + cyl + disp + hp, family = "binomial", 
#            data = .x)
# 
# Coefficients:
# (Intercept)          mpg          cyl         disp           hp  
#      4.9180      -0.5335      17.2521      -0.7975       0.5192  
# 
# Degrees of Freedom: 7 Total (i.e. Null);  3 Residual
# Null Deviance:        10.59 
# Residual Deviance: 2.266e-10  AIC: 10

您可以使用mutatemap提取信息,如下所示。

代码语言:javascript
运行
复制
data4 <- data3 %>% mutate(Coef = map(Model, coef))

data4 %>%
  filter(group == 1, Y == "am") %>%
  pull(Coef)
# [[1]]
# (Intercept)         mpg         cyl        disp          hp 
#   4.9179574  -0.5334823  17.2520829  -0.7974839   0.5191961 

或者使用broom包中的函数。

代码语言:javascript
运行
复制
library(broom)

data5 <- data3 %>%
  mutate(Info = map(Model, tidy)) %>%
  select(-Model, -data) %>%
  unnest(cols = "Info")
data5
# # A tibble: 40 x 7
# # Groups:   group, Y [8]
#   group Y     term        estimate std.error  statistic p.value
#    <int> <chr> <chr>          <dbl>     <dbl>      <dbl>   <dbl>
#  1     1 vs    (Intercept)  397.     4682905.  0.0000849   1.000
#  2     1 vs    mpg           -8.95    176775. -0.0000507   1.000
#  3     1 vs    cyl          -41.9     141996. -0.000295    1.000
#  4     1 vs    disp           0.525     1510.  0.000348    1.000
#  5     1 vs    hp            -0.610     8647. -0.0000705   1.000
#  6     2 vs    (Intercept)  126.     2034044.  0.0000619   1.000
#  7     2 vs    mpg           -0.965    69501. -0.0000139   1.000
#  8     2 vs    cyl           25.6     398854.  0.0000642   1.000
#  9     2 vs    disp           0.266     3917.  0.0000680   1.000
# 10     2 vs    hp            -2.29     19162. -0.000120    1.000
# # ... with 30 more rows
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58201192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档