如何通过循环创建多个模型对象的向量

时间:2016-09-13 04:09:58

标签: r

我有一个包含多个目标变量的大型数据集。目前,我在为模型的一部分编写代码/循环时遇到了问题,即

mod <- list(ah=ah,bn=bn). 

#Detailed code is as follows:

jk<- data.frame(y=runif(40), l=runif(40), m=runif(40), p=runif(40))
ah <- lm(l ~ p, jk) 
bn <- lm(m ~ y, jk) 
mod <- list(ah=ah,bn=bn) 
for (i in names(mod))
{ 
jk[[i]] <- predict(mod[[i]], jk)
}
问题是,如果有200个模型那么写啊=啊,bn = bn 200次将是一项繁琐的任务。因此,我需要一个循环来运行相同的,以便在下面的预测函数中使用。

1 个答案:

答案 0 :(得分:0)

如果我们只关心在list中获取'mod',请在新环境中创建对象,并在列出对象(mget)后使用ls()获取值来自环境

e1 <- new.env()
e1$ah <- lm(l ~ p, jk) 
e1$bn <- lm(m ~ y, jk) 
mod <- mget(ls(envir=e1), envir = e1)
mod
#$ah

#Call:
#lm(formula = l ~ p, data = jk)

#Coefficients:
#(Intercept)            p  
#     0.4800       0.0145  


#$bn

#Call:
#lm(formula = m ~ y, data = jk)

#Coefficients:
#(Intercept)            y  
#    0.37895     -0.02564  

或另一种选择是使用paste

mod1 <- mget(paste0(c("a", "b"), c("h", "n")), envir = e1)
names(mod1)
#[1] "ah" "bn"

如果有很多对象并且我们想要按顺序返回它们,即假设我们在环境中有'ah1','ah2',...这将是有用的

e2 <- new.env()
e2$ah1 <- 1:5
e2$ah2 <- 1:6
e2$ah3 <- 3:5
new1 <- mget(paste0("ah", 1:3), envir = e2)
new1
#$ah1
#[1] 1 2 3 4 5

#$ah2
#[1] 1 2 3 4 5 6

#$ah3
#[1] 3 4 5

现在,应用循环来获取基于'mod'的predict

for (i in names(mod)){ 
 jk[[i]] <- predict(mod[[i]], jk)
}
head(jk)
#         y          l         m         p        ah        bn
#1 0.2925740 0.47038243 0.5268515 0.9267596 0.4934493 0.3714515
#2 0.2248911 0.37568719 0.1203445 0.5141895 0.4874671 0.3731871
#3 0.7042230 0.27253736 0.5068240 0.6584371 0.4895587 0.3608958
#4 0.5188971 0.21981567 0.2168941 0.7158389 0.4903910 0.3656480
#5 0.6626196 0.04366575 0.3655512 0.3298476 0.4847942 0.3619626
#6 0.9204438 0.07509480 0.3494581 0.7410798 0.4907570 0.3553514

数据

set.seed(24)
jk<- data.frame(y=runif(40), l=runif(40), m=runif(40), p=runif(40))