我想循环浏览许多模型并输出系数
基本上我想做下面的代码所做的事情。但是,随后引用生成的列表中的每个对象,该对象包含每个模型的对象列表以及模型语句生成的数据对象。
所以我想要的系数的例子如下
library(broom)
library(tidyr)
library(dplyr)
library(nnet)
db<-mtcars
modelmpg<-multinom(cyl ~ vs + carb+ mpg, data = db)
modelmpg <- tidy(modelmpg, exponentiate = T)
modelmpg1 <- modelmpg[-5]
modelmpg2 <- reshape2::melt(modelmpg1, id=(c("y.level", "term")))
modelmpg3 <- spread(modelmpg2, y.level, value )
modelmpg3$term[modelmpg3$variable %in% c("std.error", "p.value")] <- ""
现在假设我想为一大堆变量执行此操作,并为 vs、carb 和第三个变量 i 的每个组合运行模型,第三个变量 i 是已识别变量列表中标识的变量之一
#create varlist
varlist.iv <- c("mpg", "disp", "drat", "wt")
#create a list of the results for each multinomial log regression
models <- lapply(varlist.iv , function(x) {multinom(substitute(cyl ~ vs + carb + i ,list(i = as.name(x))), data = db)})
这就是一切都分崩离析的地方。 我尝试在模型中的列表中将模型中的系数称为 [[i]]。它不承认它。我也尝试过 [[i]][[3]],我认为这意味着名为 models 的列表中第 i 个对象中的第三项?见下文(代码不起作用,但它显示了我正在尝试做什么(
#Run a loop for each of the data manipulation steps
for (i in models){
mod <- tidy(mod1[[i]], exponentiate = T)
mod[,paste0(i,"1")] <- mod
aa = paste0(i,"1")
mod[,paste0(aa,"2")] <- aa[-5]
基本上试图复制第一个代码块,但在 varlist.iv 中的所有 i 变量中循环
谁能帮我?循环的一些帮助会很好,但帮助我了解如何识别哪个对象在哪个列表中会真正帮助我。我已经阅读了帮助文档,但我一定误解了它。
使用reformulate
动态创建公式并将所有内容放入函数中
apply_fun <- function(col, data) {
modelmpg<- nnet::multinom(reformulate(c('vs', 'carb', col), 'cyl'), data = data)
modelmpg <- broom::tidy(modelmpg, exponentiate = T)
modelmpg1 <- modelmpg[-5]
modelmpg2 <- reshape2::melt(modelmpg1, id=(c("y.level", "term")))
modelmpg3 <- tidyr::spread(modelmpg2, y.level, value )
modelmpg3$term[modelmpg3$variable %in% c("std.error", "p.value")] <- ""
modelmpg3
}
使用lapply
将其应用于每个varlist.iv
lapply(varlist.iv, apply_fun, data = db)
#[[1]]
# term variable 6 8
#1 (Intercept) estimate 1.113636e+36 4.403167e+62
#2 std.error 9.005444e+01 1.055447e+02
#3 p.value 3.566995e-01 1.717352e-01
#4 carb estimate 2.347367e-01 3.671800e-02
#5 std.error 2.798606e+00 3.669880e+00
#6 p.value 6.045548e-01 3.678889e-01
#7 mpg estimate 3.267209e-02 2.018146e-03
#8 std.error 3.798023e+00 4.566156e+00
#9 p.value 3.676982e-01 1.741347e-01
#10 vs estimate 2.157612e-04 1.245287e-12
#11 std.error 1.188903e+01 1.471332e+02
#12 p.value 4.776976e-01 8.522056e-01
#[[2]]
# term variable 6 8
#1 (Intercept) estimate 8.958256e-20 1.550393e-30
#2 std.error 8.886837e+01 1.147019e+02
#3 p.value 6.216388e-01 5.495648e-01
#4 carb estimate 8.551950e+01 9.671903e+00
#...
在这里,我试图保持代码的主要风格并进行一些小的更改。我想您可以尝试以下行来生成models
models <- lapply(varlist.iv , function(x) {multinom(as.formula(paste0("cyl ~ vs + carb + ",x)), data = db)})
然后,要引用models
中的i
-th模型,应该使用i
作为索引,即i in 1:length(models)
,而不是i in models
。我不知道您在for
循环中究竟要做什么,所以我只是预览mod
以向您展示mod
(列表(中包含的内容:
for (i in 1:length(models)){
mod[[i]] <- tidy(models[[i]], exponentiate = T)
# mod[,paste0(i,"1")] <- mod
# aa = paste0(i,"1")
# mod[,paste0(aa,"2")] <- aa[-5]
}
这样
> mod
# A tibble: 8 x 6
y.level$y.level $term $estimate $std.error $statistic $p.value term$y.level $term $estimate $std.error
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <dbl> <dbl>
1 6 (Int~ 1.11e+36 90.1 0.922 0.357 6 (Int~ 8.96e-20 88.9
2 6 vs 2.16e- 4 11.9 -0.710 0.478 6 vs 4.41e- 3 46.6
3 6 carb 2.35e- 1 2.80 -0.518 0.605 6 carb 8.55e+ 1 14.3
4 6 mpg 3.27e- 2 3.80 -0.901 0.368 6 disp 1.26e+ 0 0.562
5 8 (Int~ 4.40e+62 106. 1.37 0.172 8 (Int~ 1.55e-30 115.
6 8 vs 1.25e-12 147. -0.186 0.852 8 vs 6.88e-15 13.0
7 8 carb 3.67e- 2 3.67 -0.900 0.368 8 carb 9.67e+ 0 55.6
8 8 mpg 2.02e- 3 4.57 -1.36 0.174 8 disp 1.49e+ 0 1.57
# ... with 16 more variables: $statistic <dbl>, $p.value <dbl>, estimate$y.level <chr>, $term <chr>,
# $estimate <dbl>, $std.error <dbl>, $statistic <dbl>, $p.value <dbl>, std.error$y.level <chr>,
# $term <chr>, $estimate <dbl>, $std.error <dbl>, $statistic <dbl>, $p.value <dbl>, statistic <dbl>,
# p.value <dbl>
希望以上内容可以为您的问题提供一些帮助。