2

我的结果是 NA。我究竟做错了什么?

data(Boston, package='MASS')

x <- Boston$dis
y <- Boston$nox
n <- length(x)
cvs <- rep(0, n)

for(i in 1:n){
 xi <- x[-i]
 yi <- y[-i]
 d <- loess(yi~xi, span=0.2, degree=2)
 cvs[i] <- (y[i] - predict(d, newdata=data.frame(xi=x[i])))^2
}

mean(cvs)
4

3 回答 3

2
mean(cvs,na.rm=TRUE)
[1] 0.003753745

plot(y~x)
lines( d$x[order(d$x)], d$fitted[order(d$x)])
which(is.na(d$fitted[order(d$x)]) )
#integer(0)

您可以看到 NA 处于 x 范围的极端:

#add as debugging code
if(is.na(cvs[i]) ) {print(i);print(x[i])}}
[1] 354
[1] 12.1265
[1] 373
[1] 1.1296

 range(x)
#[1]  1.1296 12.1265

但我还是不明白为什么:

(y[ which(is.na(cvs)) ]-predict(d, x[ which(is.na(cvs)) ] ))^2
[1] 3.218139e-06 3.742504e-04
于 2013-10-31T02:07:03.720 回答
1

聚合函数,例如默认情况下mean不允许NA值,但结果向量中有一些:

which(is.na(cvs))
## [1] 354 373

不确定它们来自哪里,但您可以通过传递使mean函数接受NAna.rm=TRUE

于 2013-10-31T00:46:13.917 回答
0

您需要设置loess.control(surface = "direct")才能推断。

您可能还想找到一种更快的方法来做到这一点,因为这需要大量的拟合。

于 2016-03-26T00:29:31.763 回答