Технически вам не нужно использовать as.formula()
, как подсказывает @Sonny, но вы не можете смешивать символьное представление формулы и обозначения формулы. Итак, вы должны это исправить. Однако, как только вы это сделаете, вы заметите, что есть другие проблемы с вашим кодом, которые @Sonny либо не заметил, либо решил не обращать на них внимания.
В частности, линия
reg.pred = rep(0, ncol(dt))
подразумевает, что вы хотите одно предсказание для каждой модели, но
predict(reg, data = dt[(0.8*nrow(dt)):nrow(dt),])
подразумевает, что вы хотите получить прогноз для каждого из наблюдений, отсутствующих в тренировочном наборе (кстати, для этого вам понадобится +1 после 0.8*nrow(dt)
).
Я думаю, что следующие проблемы должны решить все ваши проблемы:
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
В этой матрице прогнозов каждый столбец относится к разной модели, и строки соответствуют четырем последним строкам ваших данных (строкам, не входящим в ваш тренировочный набор).