首先,我将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
关于我做错了什么的任何建议?
答案 0 :(得分:1)
问题在于,您将dis
和nox
拉入y
和x
,然后将Boston
,而非 x
和y
。由于您的公式包含x
和y
,但您告诉它适合foldOther
,其中包含nox
和dis
,R会在全局工作空间中搜索适用于x
和y
。它找到了它们,但它们具有完整的原始长度。然后predict()
寻找x
和y
,但未在foldi
中找到它们,但它确实在全局工作区中找到它们,但现在foldi
已找到它们行数少于它找到的x
和y
,因此是第一次警告。
第二个问题是您使用foldi$y
评估MSE,其中不存在 - y
中没有Boston
。
如果您忽略创建新的x
和y
,那么您将使自己的生活变得更轻松,因为这会让事情变得混乱。而是直接引用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)
制造