使用交叉验证在R

时间:2017-04-28 18:16:34

标签: r

首先,我将R与MASS库和波士顿数据结合使用,并将dis与nox变量相关联。

我尝试做的是使用交叉验证cv来选择最佳多项式度(在1-10之间)并将最优多项式拟合到数据和图中。 要做到这一点,我使用从左到右减小的跨度,并使用cv选择最佳跨度。 以下是我的表现:

library(MASS)
x<- Boston$nox
y<- Boston$dis

k <- 5
fold <- sample(k, nrow(Boston), replace=T)

## For each span from 1 to 10 we can calculate the CV test error:
mse <- vector(length=k)
span <- seq(1,10, by=1)
cv <- vector(length=length(span))

for (j in 1:length(span))
{
  for (i in 1:k)
  {
    foldi <- Boston[fold==i,]
    foldOther <- Boston[fold!=i,]
    f <- loess(y ~ x, data=foldOther, span=span[j])
    pred <- predict(f, foldi)
    mse[i] <-mean((pred - foldi$y)^2, na.rm=T) 
  }
  cv[j]<- mean(mse)
}

plot(span, cv)

问题是,当我运行代码时,我得到50或更多警告!这是第3个:

1: 'newdata' had 89 rows but variables found have 506 rows
2: 'newdata' had 115 rows but variables found have 506 rows
3: 'newdata' had 106 rows but variables found have 506 rows

当我运行plot(span,cv)命令时,我收到以下警告:

Error in plot.window(...) : need finite 'ylim' values
In addition: Warning messages:
1: In min(x) : no non-missing arguments to min; returning Inf
2: In max(x) : no non-missing arguments to max; returning -Inf

关于我做错了什么的任何建议?

1 个答案:

答案 0 :(得分:1)

问题在于,您将disnox拉入yx,然后将Boston而非 xy。由于您的公式包含xy,但您告诉它适合foldOther,其中包含noxdis,R会在全局工作空间中搜索适用于xy。它找到了它们,但它们具有完整的原始长度。然后predict()寻找xy,但未在foldi中找到它们,但它确实在全局工作区中找到它们,但现在foldi已找到它们行数少于它找到的xy,因此是第一次警告。

第二个问题是您使用foldi$y评估MSE,其中不存在 - y中没有Boston

如果您忽略创建新的xy,那么您将使自己的生活变得更轻松,因为这会让事情变得混乱。而是直接引用Boston中已知的响应和预测变量。例如:

library(MASS)

k <- 5
fold <- sample(k, nrow(Boston), replace = TRUE)

## For each span from 1 to 10 we can calculate the CV test error:
mse <- numeric(k)
span <- seq(1, 10, by = 1)
cv <- numeric(length(span)))

for (j in seq_along(span))
{
  for (i in seq_len(k))
  {
    take <- fold == i
    foldi <- Boston[take, ]
    foldOther <- Boston[!take, ]
    f <- loess(dis ~ nox, data=foldOther, span=span[j])
    pred <- predict(f, foldi)
    mse[i] <- mean((pred - foldi$dis)^2, na.rm = TRUE)
  }
  cv[j]<- mean(mse)
}

plot(span, cv)
制造

enter image description here