【问题标题】:how to unlist a list of regression models in R如何在R中取消列出回归模型列表
【发布时间】:2019-10-18 00:17:21
【问题描述】:

我在单个变量 (a) 上拟合了几个模型作为 mod1。输出 mod1 包含 5 个模型的回归拟合列表。我在模型列表中做了几个操作。现在我想将 mod1 取消列出到单个回归模型输出中,例如 fit1、fit2、...fit5 等。

func <-function(z){
  fit1 <- lm( y~ x + z )
  fit2 <- lm( y~x + I(z^2))
  fit3 <- lm( y~poly(x,3) + z)
  fit4 <- lm( y~ns(x, 3) + z)
  fit5 <- lm( y~ns(x, 9) + z)
  return(list(fit1, fit2, fit3, fit4, fit5))
}

mod1 <- func(data$a) 

test <- unlist(mod1, recursive = TRUE, use.names = TRUE)

当我使用 unlist() 时,输出变成了非常长的无法理解的字符串。即使我尝试了以下操作,它仍然是 1 个模型的列表。

fit1 <- mod1[1]

有人知道如何从回归模型输出列表中逐一分离模型吗?

提前致谢!

【问题讨论】:

标签: r list model regression


【解决方案1】:

我建议结合使用broom 来整理lm 的输出,以及使用标准列表方法lapply[[ 索引来处理列表。

阅读更多关于在 R here 中使用列表的信息。

library(splines)

# create some example data
d <- data.frame(x = rnorm(100, 0, 1),
                y = rnorm(100, 0, 1),
                z = rnorm(100, 0, 1))

# function to fit 5 models
func <-function(d){
  fit1 <- lm( y~ x + z, data = d)
  fit2 <- lm( y~x + I(z^2), data = d)
  fit3 <- lm( y~poly(x,3) + z, data = d)
  fit4 <- lm( y~ns(x, 3) + z, data = d)
  fit5 <- lm( y~ns(x, 9) + z, data = d)

  # store models in a list
  l <- list(fit1, fit2, fit3, fit4, fit5)

  # name the models
  names(l) <- paste0("fit", 1:5) 

  return(l)
}

# run the function
mods <- func(d) 

使用双括号[[访问列表的每个元素

mods[[1]]

Call:
  lm(formula = y ~ x + z, data = d)

Coefficients:
  (Intercept)            x            z  
0.03339     -0.05128     -0.15288  

mods[[2]]

Call:
  lm(formula = y ~ x + I(z^2), data = d)

Coefficients:
  (Intercept)            x       I(z^2)  
0.01739     -0.04490      0.01258  

使用扫帚“整理”模型输出

library(broom)
tidy(mods[[1]])

# A tibble: 3 x 5
term        estimate std.error statistic p.value
<chr>          <dbl>     <dbl>     <dbl>   <dbl>
  1 (Intercept)   0.0334    0.0985     0.339   0.735
2 x            -0.0513    0.103     -0.499   0.619
3 z            -0.153     0.102     -1.50    0.138

使用lapply(或purrr::map)整理模型输出列表。

tidy_mods <- lapply(mods, tidy) 

# add names to each data frame and combine into one big data frame
for(i in 1:length(tidy_mods)) tidy_mods[[i]]$mod <- names(tidy_mods[i])
do.call(rbind.data.frame, tidy_mods)

# A tibble: 27 x 6
term        estimate std.error statistic p.value mod  
* <chr>          <dbl>     <dbl>     <dbl>   <dbl> <chr>
  1 (Intercept)   0.0334    0.0985     0.339  0.735  fit1 
2 x            -0.0513    0.103     -0.499  0.619  fit1 
3 z            -0.153     0.102     -1.50   0.138  fit1 
4 (Intercept)   0.0174    0.130      0.134  0.894  fit2 
5 x            -0.0449    0.105     -0.429  0.669  fit2 
6 I(z^2)        0.0126    0.0894     0.141  0.888  fit2 
7 (Intercept)   0.0309    0.0975     0.317  0.752  fit3 
8 poly(x, 3)1  -0.493     0.975     -0.505  0.614  fit3 
9 poly(x, 3)2  -0.569     0.975     -0.584  0.561  fit3 
10 poly(x, 3)3   1.78      0.976      1.83   0.0709 fit3 

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2016-10-07
    • 2021-12-27
    • 2018-12-01
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多