在R中使用LOOCV分割的线性回归返回错误

在R中使用LOOCV分割的线性回归返回错误,r,machine-learning,regression,linear-regression,cross-validation,R,Machine Learning,Regression,Linear Regression,Cross Validation,我试着用剔除交叉验证分割来拟合线性模型 我使用它,数据集有517行13列(其中两个是分类变量)。因变量为“面积” 我想建立一个有分类变量和没有分类变量的模型。然后是计算平均系数。当我删除分类变量时,代码运行良好,但是当我保留它们时,我在estcoef[I,]中得到了以下错误如果不创建矩阵来存储系数,而是将系数存储在列表中,则问题很容易解决。这样,就不会有任何项目需要替换,所有项目都将在以后处理 在下面的代码中,我使用内置数据集iris,将响应的名称更改为区域 wdbc <- iris na

我试着用剔除交叉验证分割来拟合线性模型

我使用它,数据集有517行13列(其中两个是分类变量)。因变量为“面积”


我想建立一个有分类变量和没有分类变量的模型。然后是计算平均系数。当我删除分类变量时,代码运行良好,但是当我保留它们时,我在estcoef[I,]中得到了以下错误如果不创建矩阵来存储系数,而是将系数存储在
列表中,则问题很容易解决。这样,就不会有任何项目需要替换,所有项目都将在以后处理

在下面的代码中,我使用内置数据集
iris
,将响应的名称更改为
区域

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
另一种方法是在运行函数之前删除问题值(可能只有一个数据点并不重要)


wdbc2如果不创建矩阵来存储系数,而是将系数存储在
列表中,则问题很容易解决。这样就不会有可替换的项,所有项都将在以后处理

在下面的代码中,我使用内置数据集
iris
,将响应的名称更改为
区域

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
另一种方法是在运行函数之前删除问题值(可能只有一个数据点并不重要)



wdbc2你看过
coef(model1)
length(coef(model1))
吗?你似乎假设系数的数量与列的数量相同,但事实并非如此。因为我没有你的数据,我无法检查有什么不同。但是
coef(model1)
应该是一个很好的命名向量,它可以解释这个问题……如果其中一个回归器是以
n
级别分类的,那么这个变量可能有更多的系数,
n-1
。加上其他回归器。@Gregor,我提供了问题中数据的链接。@Rui Barradas,那么我应该怎么做才能使e我的代码就像没有分类变量一样工作。完成了,请看我的答案。你看过
coef(model1)
length(coef(model1))
?你似乎假设系数的数量与列的数量相同,而事实并非如此。因为我没有你的数据,我无法检查有什么不同。但是
coef(模型1)
应该是一个很好的命名向量,它可以解释这个问题……如果其中一个回归器是以
n
级别分类的,那么这个变量可能有更多的系数,
n-1
。加上其他回归器。@Gregor,我提供了问题中数据的链接。@Rui Barradas,那么我应该怎么做才能使e我的代码在没有分类变量的情况下工作。完成,请参阅我的答案。谢谢,但当我在model.frame.default(Terms,newdata,na.action=na.action,xlev=object$xlevels)中对数据运行代码时,我得到了“Error”:factor month具有新级别nov'@jeza错误出现在对
predict
的调用中。这是因为只有一行
month==“nov"。因此,当它从训练数据中被重新编译时,拟合的模型没有<代码> NOV。然后尝试用一个新的水平来预测,并且<代码>预测< /代码>不知道如何处理这个值。@ JEZA看到编辑。也许添加的代码解决了这个问题。我明白了。好的,有没有解决这个问题的方法?谢谢你,我会考虑的。是一个解决方案,除非我们得到其他人的答案。谢谢,但是当我对我的数据运行代码时,我得到了“model.frame.default中的错误”(Terms,newdata,na.action=na.action,xlev=object$xlevels):factor month具有新级别nov'@jeza错误在调用
predict
中。这是因为只有一行
month==“nov”。因此,当它从训练数据中被重新编译时,拟合的模型没有<代码> NOV。然后尝试用一个新的水平来预测,并且<代码>预测< /代码>不知道如何处理这个值。@ JEZA看到编辑。也许添加的代码解决了这个问题。我明白了。好的,有没有解决这个问题的方法?谢谢你,我会考虑的。这是一个解决方案,除非我们得到其他人的答案。
> 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
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
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)