【问题标题】:loop over variable names循环变量名
【发布时间】:2019-07-29 15:13:16
【问题描述】:

我正在尝试使用不同的列(我的数据集中的自变量)构建各种回归模型。

set.seed(0)
True = rnorm(20, 100, 10)
v = matrix(rnorm(120, 10, 3), nrow = 20)
dt = data.frame(cbind(True, v))
colnames(dt) = c('True', paste0('ABC', 1:6))

所以我要放入数据中的自变量是“ABCi”,也就是当 i=1 时,使用 ABC1 等。每个模型使用前 80% 的观测值来构建,然后我对休息20%。

我试过了:

reg.pred = rep(0, ncol(dt))
for (i in 1:nrow(dt)){
  reg = lm(True~paste0('ABC', i), data = dt[(1:(0.8*nrow(dt))),])
  reg.pred[i] = predict(reg, data = dt[(0.8*nrow(dt)):nrow(dt),])
}

不工作...给出如下错误:

Error in model.frame.default(formula = True ~ paste0("ABC", i), data = dt[(1:(0.8 *  : 
  variable lengths differ (found for 'paste0("ABC", i)')

不知道如何在循环中检索变量名...任何建议都值得赞赏!

【问题讨论】:

  • 看起来您正在循环使用 for (i in 1:nrow(dt)){ 而不是列的行

标签: r function loops regression


【解决方案1】:

从技术上讲,您不需要像 @Sonny 建议的那样使用 as.formula(),但您不能混合使用公式的字符表示和公式表示法。所以,你需要解决这个问题。但是,一旦您这样做了,您就会注意到您的代码中还有其他问题,@Sonny 要么没有注意到,要么选择不解决。

最值得注意的是,这条线

reg.pred = rep(0, ncol(dt))

意味着您希望每个模型都有一个预测,但是

predict(reg, data = dt[(0.8*nrow(dt)):nrow(dt),])

表示您希望对不在训练集中的每个观察进行预测(顺便说一下,您需要在 0.8*nrow(dt) 之后加上 +1)。

我认为以下内容应该可以解决您的所有问题:

set.seed(0)
True = rnorm(20, 100, 10)
v = matrix(rnorm(120, 10, 3), nrow = 20)
dt = data.frame(cbind(True, v))
colnames(dt) = c('True', paste0('ABC', 1:6))
# Make a matrix for the predicted values; each column is for a model
reg.pred = matrix(0, nrow = 0.2*nrow(dt), ncol = ncol(dt)-1)
for (i in 1:(ncol(dt)-1)){
    # Get the name of the predictor we want here
    this_predictor <- paste0("ABC", i)
    # Make a character representation of the lm formula
    lm_formula <- paste("True", this_predictor, sep = "~")
    # Run the model
    reg = lm(lm_formula, data = dt[(1:(0.8*nrow(dt))),])
    # Get the appropriate test data
    newdata <- data.frame(dt[(0.8*nrow(dt)+1):nrow(dt), this_predictor])
    names(newdata) <- this_predictor
    # Store predictions
    reg.pred[ , i] = predict(reg, newdata = newdata)
}

reg.pred

#          [,1]     [,2]     [,3]      [,4]      [,5]     [,6]
# [1,] 100.2150 100.8394 100.7915  99.88836  97.89952 105.7201
# [2,] 101.2107 100.8937 100.9110 103.52487 102.13965 104.6283
# [3,] 100.0426 101.0345 101.2740 100.95785 102.60346 104.2823
# [4,] 101.1055 100.9686 101.5142 102.56364 101.56400 104.4447

在这个预测矩阵中,每一列都来自不同的模型,行对应于数据的最后四行(不在训练集中的行)。

【讨论】:

  • 非常感谢!是的,我没有意识到我的原始代码中的错误,现在它完美地工作了。真的很感激!
  • @RachelZhang 太好了,很高兴它有帮助!
【解决方案2】:

你可以使用as.formula

  f <- as.formula(
    paste("True", 
          paste0('ABC', i), 
          sep = " ~ "))

  reg = lm(f, data = dt[(1:(0.8*nrow(dt))),])

【讨论】:

  • 您是否尝试使用该修改运行她的代码?
猜你喜欢
  • 2019-02-03
  • 2019-11-19
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
相关资源
最近更新 更多