我试图找出哪种交叉验证方法最适合我的情况。
以下数据只是解决问题的一个示例(在 R 中),但我的真实X
数据 ( xmat
) 彼此相关,并且与y
变量 ( ymat
) 有不同程度的相关。我提供了 R 代码,但我的问题不是关于 R,而是关于方法。Xmat
包括 X 变量 V1 到 V100,同时ymat
包括单个 y 变量。
set.seed(1233)
xmat <- matrix(sample(-1:1, 20000, replace = TRUE), ncol = 100)
colnames(xmat) <- paste("V", 1:100, sep ="")
rownames(xmat) <- paste("S", 1:200, sep ="")
# the real y data are correlated with xmat
ymat <- matrix(rnorm(200, 70,20), ncol = 1)
rownames(ymat) <- paste("S", 1:200, sep="")
我想建立一个y
基于所有变量的预测模型xmat
。所以这将是一个线性回归模型y ~ V1 + V2 + V3+ ... + V100
。从评论中,我可以看到以下三种交叉验证方法:
将数据分成大约一半,一个用于训练,另一半用于测试(交叉验证):
prop <- 0.5 # proportion of subset data set.seed(1234) # training data set training.s <- sample (1:nrow(xmat), round(prop*nrow(xmat),0)) xmat.train <- xmat[training.s,] ymat.train <- ymat[training.s,] # testing data set testing.s <- setdiff(1:nrow(xmat), training) xmat.test <- xmat[testing.s,] ymat.test <- ymat[testing.s,]
K 折交叉验证- 使用 10 折交叉验证:
mydata <- data.frame(ymat, xmat) fit <- lm(ymat ~ ., data=mydata) library(DAAG) cv.lm(df=mydata, fit, m=10) # ten-fold cross validation
一次屏蔽一个或几个值:在这种方法中,我们通过将数据集 (y) 中的一个值替换为 NA 来随机屏蔽一个值并对其进行预测。该过程重复n次。
n = 500 predicted.v <- rep(NA, n) real.v <- rep(NA, n) for (i in 1:n){ masked.id <- sample (1:nrow(xmat), 1) ymat1 <- ymat real.v[i] <- ymat[masked.id,] ymat1[masked.id,] <- NA mydata <- data.frame(ymat1, xmat) fit <- lm(ymat1 ~ ., data=mydata) predicted.v[i] <- fit$fitted.values[masked.id] }
我怎么知道哪种情况最适合?还有其他方法吗?Bootstrap validation
与CV
?工作示例将不胜感激。