- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用留一交叉验证分割来拟合线性模型。
我用过这个DATASET ,数据集有 517 行和 13 列(其中两列是分类变量)。因变量是“面积”。
我想构建一个包含和不包含分类变量的模型。然后是计算系数均值。当我删除分类变量时,代码运行良好,但是当我保留它们时,出现以下错误 "Error in estcoef[i, ] <- coef(model1) : 要替换的项目数量不是替换长度的倍数”
我的代码如下
wdbc<- read.csv("forestfires.csv") ## upload the dataset
wdbc<-wdbc[-(3:4)] ## If I want to build the model without the catogrical variables
#####################################
fitted_value <- rep(0,nrow(wdbc))
estcoef<-matrix(0,nrow=nrow(wdbc),ncol=ncol(wdbc)) #estimation coefficients
# LOOCV split leave one out cross validation
for(i in 1:nrow(wdbc)){
validation<-wdbc[i,]
training<-wdbc[-i,]
model1<-lm(area ~ ., data = training)
fitted_value[i] <- predict(model1, newdata = validation)
estcoef[i,]<-coef(model1)
}
meancoef<-colMeans(estcoef) #coefficent means
有人可以帮我解决这个问题吗?
我很乐意提供任何其他附加信息。
已更新
我包含了前 10 行数据
X Y month day FFMC DMC DC ISI temp RH wind rain area
1 7 5 mar fri 86.2 26.2 94.3 5.1 8.2 51 6.7 0.0 0
2 7 4 oct tue 90.6 35.4 669.1 6.7 18.0 33 0.9 0.0 0
3 7 4 oct sat 90.6 43.7 686.9 6.7 14.6 33 1.3 0.0 0
4 8 6 mar fri 91.7 33.3 77.5 9.0 8.3 97 4.0 0.2 0
5 8 6 mar sun 89.3 51.3 102.2 9.6 11.4 99 1.8 0.0 0
6 8 6 aug sun 92.3 85.3 488.0 14.7 22.2 29 5.4 0.0 0
7 8 6 aug mon 92.3 88.9 495.6 8.5 24.1 27 3.1 0.0 0
8 8 6 aug mon 91.5 145.4 608.2 10.7 8.0 86 2.2 0.0 0
9 8 6 sep tue 91.0 129.5 692.6 7.0 13.1 63 5.4 0.0 0
10 7 5 sep sat 92.5 88.0 698.6 7.1 22.8 40 4.0 0.0 0
我还包括了最后 10 行,这表明我们只有一行月份 = Nov(最后一行),即使提供了答案也会返回错误。
> tail(wdbc,10)
X Y month day FFMC DMC DC ISI temp RH wind rain area
508 2 4 aug fri 91.0 166.9 752.6 7.1 25.9 41 3.6 0.0 0.00
509 1 2 aug fri 91.0 166.9 752.6 7.1 25.9 41 3.6 0.0 0.00
510 5 4 aug fri 91.0 166.9 752.6 7.1 21.1 71 7.6 1.4 2.17
511 6 5 aug fri 91.0 166.9 752.6 7.1 18.2 62 5.4 0.0 0.43
512 8 6 aug sun 81.6 56.7 665.6 1.9 27.8 35 2.7 0.0 0.00
513 4 3 aug sun 81.6 56.7 665.6 1.9 27.8 32 2.7 0.0 6.44
514 2 4 aug sun 81.6 56.7 665.6 1.9 21.9 71 5.8 0.0 54.29
515 7 4 aug sun 81.6 56.7 665.6 1.9 21.2 70 6.7 0.0 11.16
516 1 4 aug sat 94.4 146.0 614.7 11.3 25.6 42 4.0 0.0 0.00
517 6 3 nov tue 79.5 3.0 106.7 1.1 11.8 31 4.5 0.0 0.00
最佳答案
如果不创建矩阵来存储系数,而是将它们存储在列表
中,那么问题就可以轻松解决。这样就没有需要更换的元素了,一切都会在以后处理。
在下面的代码中,我使用内置数据集iris
,将响应的名称更改为area
。
wdbc <- iris
names(wdbc)[1] <- "area"
fitted_value <- rep(0, nrow(wdbc))
estcoef <- vector("list", length = nrow(wdbc))
# LOOCV split leave one out cross validation
for(i in 1:nrow(wdbc)){
validation <- wdbc[i,]
training <- wdbc[-i, ]
model1 <- lm(area ~ ., data = training)
fitted_value[i] <- predict(model1, newdata = validation)
estcoef[[i]] <- coef(model1)
}
estcoef <- do.call(rbind, estcoef)
meancoef <- colMeans(estcoef) # coefficent means
编辑。
Op 提示一个错误:
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) :
factor month has new level nov
这是因为数据集只有一行 month == "nov"
,因此在拟合模型时忽略这一行,validation
数据集month
列中的值不存在于 training
数据集中,并且 predict
不知道如何处理它。
解决方案是使用tryCatch
捕获错误并让代码继续运行。下面的函数是上面代码的重复,并调用 tryCatch
。它返回系数平均值和拟合值。当 predict
给出错误时,返回值为 NaN
。随意更改。
fitModelLOOCV <- function(DF){
fitted_value <- rep(0, nrow(DF))
estcoef <- vector("list", length = nrow(DF))
# LOOCV split leave one out cross validation
for(i in 1:nrow(DF)){
validation <- DF[i,]
training <- DF[-i, ]
model1 <- lm(area ~ ., data = training)
fitted_value[i] <- tryCatch(predict(model1, newdata = validation),
error = function(e) {print(e); NaN})
estcoef[[i]] <- coef(model1)
}
estcoef <- do.call(rbind, estcoef)
meancoef <- colMeans(estcoef) # coefficent means
list(meancoef = meancoef, fitted = fitted_value)
}
fitModelLOOCV(wdbc)
另一种方法是在运行函数之前删除问题值。 (也许只有一个数据点并不那么重要。)
wdbc2 <- wdbc[-which(wdbc$month == "nov"), ]
fitModelLOOCV(wdbc2)
关于r - R 中 LOOCV 拆分的线性回归返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56962739/
我尝试使用留一交叉验证分割来拟合线性模型。 我用过这个DATASET ,数据集有 517 行和 13 列(其中两列是分类变量)。因变量是“面积”。 我想构建一个包含和不包含分类变量的模型。然后是计算系
我想对一些数据进行平滑样条拟合,我注意到内部计算的 LOOCV 误差似乎取决于数据是否无序。具体来说,我只在订购数据时得到预期的结果。 我不明白为什么会出现这种情况?有帮助吗? set.seed(0)
我有这个数据集,我正在尝试使用 R 找到最佳模型 数据集: structure(list(V1 = c(1.43359910241166, 0.411971077467806, 0.236361845
我正在尝试使用 R caret 模块生成模型,并且我想使用一些交叉验证功能。我发现唯一与 rpart 一起工作的交叉验证功能是 LOOCV (留下一个交叉验证)。 以下代码引发错误: library(
我尝试使用 cv.glmnet 和 glmnet 使用留一交叉验证分割来拟合正则化模型(LASSO、Ridge、ElasticNet)。 我用过这个DATASET ,数据集有 517 行和 13 列(
我是一名优秀的程序员,十分优秀!