r语言 - 引用循环中较大列表中的列表



我想循环浏览许多模型并输出系数

基本上我想做下面的代码所做的事情。但是,随后引用生成的列表中的每个对象,该对象包含每个模型的对象列表以及模型语句生成的数据对象。

所以我想要的系数的例子如下

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>

希望以上内容可以为您的问题提供一些帮助。

最新更新