我正在尝试使用不同的列(数据集中的独立变量)构建各种回归模型。
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)')
不确定如何在循环中检索变量名...任何建议,我们将不胜感激!
答案 0 :(得分:1)
您可以使用as.formula
f <- as.formula(
paste("True",
paste0('ABC', i),
sep = " ~ "))
reg = lm(f, data = dt[(1:(0.8*nrow(dt))),])
答案 1 :(得分: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
在这种预测矩阵中,每一列都来自不同的模型,并且这些行对应于数据的最后四行(这些行不在您的训练集中)。