【问题标题】:Dynamic variables in functions in R for-loopsR for 循环中函数中的动态变量
【发布时间】:2020-08-22 16:16:48
【问题描述】:

我正在尝试自动化大部分线性回归/模型选择工作流程。但是我在 for 循环中遇到了一些问题;我猜它们主要是动态变量命名的问题。

我设法使第一步(回归建模)的循环自动化。虽然理想情况下我希望模型存储在以下约定中:lm.model, lm1.model, lm2.model ...但我不是确定如何将动态数字放在变量字符串中。我只设法把它放在最后:

lm.model[i] <- for (i in 1:5){ 
              model_name <- paste("lm.model", i , sep = "")
              assign(model_name, lm(Y ~ poly(X, i), data = training.dat))
}

但是按照当前的标签约定,下一步是行不通的:

lmod.fit[i] <- for(i in 1:5){
  fit_name <- paste("lmod.fit", i, sep = "")
  assign(fit_name, predict(lm.model[i], newdata = training.dat))
}

返回错误

Error in UseMethod("predict") : no applicable method for 'predict'
applied to an object of class "list"

在后续步骤中,我还想循环粘贴以下部分:

x1 = lm.fit, 
x2 = lm2.fit,
x3 = lm3.fit,
x4 = lm4.fit,
x5 = lm5.fit
c("x1", "x2", "x3", "x4", "x5")

但是我在使用 paste() 函数时遇到了问题,因为输出是单个字符串。

如果有一种不那么繁琐的方法来完成这一切,请告诉我我还能尝试什么!

【问题讨论】:

  • 也许这个link 是相关的。
  • 因为名字是lm.model1lm.model2不是向量也不是列表lm.model
  • 您可以通过运行ls() 命令进行检查,该命令将显示 .globalEnv 中的对象

标签: r for-loop iteration


【解决方案1】:

您的代码需要重新组织。 lm.model[i] 的赋值需要在循环内部,而不是外部:

lm.model <- list()
for (i in 1:5){ 
   model_name <- paste("lm.model", i , sep = "")
   lm.model[[model_name]] <- lm(Y ~ poly(X, i), data = training.dat)
}

预测也一样:

lmod.fit <- list()
for(i in 1:5){
  model_name <- paste("lm.model", i , sep = "")
  fit_name <- paste("lmod.fit", i, sep = "")
  lmod.fit[[fit_name]] <- predict(lm.model[[model_name]], newdata = training.dat)
}

我不明白你的最后一个请求是关于什么的。

【讨论】:

    【解决方案2】:

    为什么不在同一个for 循环中执行这些操作。 assign 的反函数也是 get。并且paste0paste(..., sep='') 更快,并且做同样的事情。 您可以使用ls() 查看全局环境中存在的对象

    for (i in 1:5){ 
         #model_name == 'lm1.model'
         model_name <- paste0("lm", i,".model")
         assign(model_name, lm(Y ~ poly(X, i), data = training.dat))
         #fit_name == 'lmod1.fit'
         fit_name <- paste0("lmod", i,".fit")
         # if you want to have two loops then instead of model_name use paste0('lm',i,'.model') or sub('lmod(\\d+)\.fit', 'lm\\1.model', fit_name)
         assign(fit_name, predict(get(model_name), newdata = training.dat))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      相关资源
      最近更新 更多