我尝试手动计算一些线性回归性能指标,并且我想使用30折交叉验证对我的data进行拆分。
这些绩效指标需要经过培训和测试才能计算出来。
我运行以下代码,但它给我一个错误(“尺寸不兼容,较长的对象长度不是较短的对象长度的倍数”)。
是否有使用createFolds
函数解决此问题的方法?
######### Upload the data set #########
wdbc <- read.delim("yacht_hydrodynamics.data",sep = "",header = FALSE)
wdbc[] <- lapply(wdbc, scale)
wdbc<-as.data.frame(wdbc)
############## Leave One Out Cross Validation split ###########
k=30
fitted_value <- rep(0,k)
for(i in 1:k){
test<-wdbc[i,]
training<-wdbc[-i,]
m=lad(V7 ~ ., data=training, method="BR")
co.data = coef(m)
x = cbind(1, as.matrix(test[, !(colnames(test) %in% "V7")]))
fitted_value[i] <- x %*% co.data
}
R2<-(cor(wdbc$V7,fitted_value)^2) ### R-squared
SAD<-sum(abs(wdbc$V7 - fitted_value)) ### Sum Absloute Deviation
c(round(SAD,2) ,round(R2,2))
NOTE
“ V7”是因变量。
您的错误来自此行:
R2<-(cor(wdbc$V7,fitted_value)^2)
如果您查看读取的data.frame:
wdbc = read.delim("http://archive.ics.uci.edu/ml/machine-learning-databases/00243/yacht_hydrodynamics.data",sep="",header=FALSE)
dim(wdbc)
[1] 308 7
因此从308的向量中减去30个值的向量不起作用
不确定是进行30倍交叉验证还是将1留空,上面的代码是1留出,应该将k = nrow(wdbc)
设置为1留出。以下是30折的建议:
k=30
foldidx = split(sample(nrow(wdbc)),1:nrow(wdbc) %% k)
fitted_value <- vector("list",k)
for(i in 1:k){
test<-wdbc[foldidx[[i]],]
training<-wdbc[-foldidx[[i]],]
m=lad(V7 ~ ., data=training, method="BR")
co.data = coef(m)
x = cbind(1, as.matrix(test[, !(colnames(test) %in% "V7")]))
fitted_value[[i]] <- x %*% co.data
}
最后一部分与值匹配,您不列出索引,也没有存储已拟合值的列表:
obs = wdbc$V7[unlist(foldidx)]
test = unlist(fitted_value)
R2<-(cor(obs,test)^2)