我现在正在做的交叉验证有问题。我有一个数据集,将其随机分为4个部分,从中选择3个作为回归模型,然后使用左第4个模型为目标值建模。到目前为止,我一直使用手动方法,但这需要大量工作,因此我想尝试使用lm中的预测函数。但是当我比较这些值时,我永远不会得到相同的结果。
这是我的数据集:
df = mtcars
subs = 4
set.seed(5)
idx <- gl(n = subs,round(nrow(df)/subs))
df = split(df,sample(idx))
names(df) = c("S1","S2","S3","S4")
df_split= rbind(df$S1,df$S2)
df_split = rbind(df_split,df$S3)
我正在像这样进行回归:
Regression <- lm(df_split$mpg ~ df_split$cyl + df_split$disp + df_split$hp + df_split$drat + df_split$wt
+ df_split$qsec)
summary(Regression)
StepRegression = step(Regression,direction="both")
finalmod = as.character(StepRegression$call)[2]
OptiRegression = lm(finalmod)
Regression_Summary= as.data.frame (summary(OptiRegression)$coefficient)
Regression_Summary$RSquared = summary(OptiRegression)$r.squared
Regression_Summary$AdjRSquared = summary(OptiRegression)$adj.r.squared
现在这是我手动计算第4个子集的mpg的方法:
gridnames = str_sub(rownames(Regression_Summary)[-1],start = 10)
Model_manual <- ((as.matrix(df$S4[,gridnames]) %*%
Regression_Summary[-1,1]) + Regression_Summary[1,1])[,1]
Model_manual = as.data.frame(Model_manual)
Model_manual
Datsun 710 25.23129
Merc 280 19.72129
Merc 280C 19.72129
Merc 450SL 16.11353
Merc 450SLC 15.97497
Fiat 128 25.96176
Toyota Corolla 26.98801
Porsche 914-2 25.75960
我尝试过使用prepare()函数来避免过多的工作。但是我从来没有得到相同的结果,而且我总是得到警告和不同的长度。
predict(OptiRegression,df$S4[,gridnames],type = "response")
1 2 3 4 5 6 7 8 9 10 11 12 13
22.18532 16.99089 11.53276 10.90318 27.78928 15.86852 16.42750 20.81169 20.53641 15.59900 15.17130 24.77051 17.13763
14 15 16 17 18 19 20 21 22 23 24
14.85076 14.27263 23.72070 21.47865 19.93114 23.27714 22.90166 10.90105 17.37318 26.69614 27.17296
我做错了什么?我很确定我的手动方法是正确的。有人可以给我一些支持吗?