[英]how to unlist a list of regression models in R
我在单个变量 (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]
有没有人知道如何从回归模型输出列表中一个一个地分离模型?
提前致谢!
我建议结合使用broom
整理lm
的输出和标准列表方法lapply
和[[
索引以使用列表。
在此处阅读有关在R中使用列表的更多信息。
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
嗨,我有类似的问题,模型 <- etf_sector_ff_tbl |> group_by(sectors) |>
mutate(
regressions = slide(
.x = cur_data(),
.f = ~lm(excess_returns~mkt_excess + smb + hml, data = .x),
.before = 60,
.complete = TRUE
)
)
这是我使用的滚动回归,所以回归是一个列表。 所以为了提取,我转换为 tidyformat, tidy_models <- lapply(model$regressions, tidy) 然后我使用上面提到的方法
对于(i in 1:length(tidy_models))tidy_models[[i]]$model <- names(tidy_models[i]) do.call(rbind.data.frame, tidy_models)
所以现在得到的结果是
术语估计 std.error 统计 p.value 1(截距)-0.00208 0.00256 -0.811 4.21e- 1 2 mkt_excess 1.20 0.0567 21.1 1.23e-28 3 smb 0.206 0.121 1.70 9.42e- 2 4 hml 0.1876 1.0876 1.0862 0.0567 21.1 1.23e-28 3 smb (截距)-0.00247 0.00263 -0.940 3.51E- 1 6 MKT_EXCESS 1.20 0.0581 20.7 3.66E -28 7 SMB 0.217 0.217 0.124 1.76 1.76 8.42E- 2 8 HML 2 8 HML 0.164 0.164 0.0895 1.895 1.83 7.18e -2 9(Inter Interpect) - 1 10 mkt_excess 1.20 0.0551 21.8 2.61e-29
所以请让我知道如何区分这些术语,因为它们每 4 个术语重复一次
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.