我试图找出哪种交叉验证方法最适合我的情况。
以下数据只是解决问题的一个示例(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
一次屏蔽一个值或几个值:在这种方法中,我们通过用NA替换数据集(y)中的一个值来对其进行随机屏蔽,并对其进行预测。该过程重复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
?工作示例将不胜感激。