通过更改变量名称和数据集执行线性模型循环

loop for linear model execution with changing vars names and data sets

我正在处理一个我想自动化的任务,我是循环和变量赋值的新手,所以任何帮助都会很棒。 该任务有两个步骤:首先获取几个具有一个不同字符的数据集,然后应用一个 lm 模型,其变量也具有一个与数据集一致的不同字符 name.For 示例:使用数据集使用名称 SF_FinalviewQ3_2013_Day**3**_BaseLine 并应用包含 IsDepositorDay**3**IsDueDay**3** 等变量的 lm。我有大约 10 个数据集和 50 个变量,我想将它们自动化,所以我尝试根据来自该站点的 answare 使用此代码,但出现错误。

Error: unexpected symbol in:
    "    eval(parse(text = paste0("SF_FinalviewQ3_2013_Day", i, "_BaseLine<-maindata"))
        f"

# Here is my code
f <- NA # first I reset f
index <- 1 # this will be the index
for(i in c(3,10){ #3,10 are the only charcter that changes in the data sets and in vars names.
    var[i]<-paste("IsDepositorDay",i,sep="")
    eval(parse(text = "var[i]"))
    maindata<-paste("SF_FinalviewQ3_2013_Day",i,"_BaseLine",sep="")
    eval(parse(text = paste0("SF_FinalviewQ3_2013_Day", i, "_BaseLine<-maindata"))
    f[index]<-lm(IsDepositorDay180~ var1,data=maindata)
    index <- index + 1
}

我该如何解决?

#per a request to make my example reproducible i did the following changes:
dat1 <- read.table(text = " target birds_1   wolfs_1     snakes_1
         0        3        9         7
         1        3        8         4
         1        1        2         8 ",header = TRUE)
dat2 <- read.table(text = " target birds_2    wolfs_2     snakes_2
         1        3        2         4
         0        8        8         3
         5        1        2         8  ",header = TRUE)


  f <- NA # first I reset f
index <- 1 # this will be the index
for(i in c(1,2)){ #1,2 are the only charcter that changes in the data sets and in vars names.
    birds_[i]<-paste("birds_",i,sep="")
    wolfs_[i]<-paste("wolfs_",i,sep="")
    snakes_[i]<-paste("snakes_",i,sep="")
    eval(parse(text = "birds_[i]"))
    eval(parse(text = "wolfs_[i]"))
    eval(parse(text = "snakes_[i]"))
    maindata<-paste("dat",i,sep="")
    eval(parse(text = paste0("dat", i, "<-maindata"))
         f[index]<-lm(target~ birds_[i]+snakes_[i],data=maindata)
         index <- index + 1
}

如果我理解正确,lm 对象可以保存在如下列表中。为了简单起见,删除了不包含在公式中的列。

# way 1 with loop    
f <- list()
dat <- list(dat1, dat2)
for(i in 1:2) f[[i]] <- lm(target ~ ., data = dat[[i]][,-3])

# way 2 with lapply
dat <- list(dat1[,-3], dat2[,-3])
lapply(dat, lm, formula = target ~ .)

[[1]]

Call:
FUN(formula = ..1, data = X[[1L]])

Coefficients:
(Intercept)      birds_1     snakes_1  
     4.3333      -0.6667      -0.3333  


[[2]]

Call:
FUN(formula = ..1, data = X[[2L]])

Coefficients:
(Intercept)      birds_2     snakes_2  
     -3            0            1  

您的一些设置建议是

  • 保持因变量(您的示例中的目标)的列名相同
  • 保持相同数量的自变量(最好保持相同的顺序)

那么公式就很容易建立,关键变量(系数...)也很容易提取。