レス回帰の場合、非統計学者としての私の理解は、視覚的な解釈に基づいてスパンを選択できることです(多数のスパン値を持つプロットは、適切と思われるスムージングの量が最も少ないものを選択できます)、またはクロス検証を使用できます(CV)または一般化された相互検証(GCV)。以下は、竹沢の優れた本であるノンパラメトリック回帰入門(p219から)のコードに基づくレス回帰のGCVに使用したコードです。
locv1 <- function(x1, y1, nd, span, ntrial)
{
locvgcv <- function(sp, x1, y1)
{
nd <- length(x1)
assign("data1", data.frame(xx1 = x1, yy1 = y1))
fit.lo <- loess(yy1 ~ xx1, data = data1, span = sp, family = "gaussian", degree = 2, surface = "direct")
res <- residuals(fit.lo)
dhat2 <- function(x1, sp)
{
nd2 <- length(x1)
diag1 <- diag(nd2)
dhat <- rep(0, length = nd2)
for(jj in 1:nd2){
y2 <- diag1[, jj]
assign("data1", data.frame(xx1 = x1, yy1 = y2))
fit.lo <- loess(yy1 ~ xx1, data = data1, span = sp, family = "gaussian", degree = 2, surface = "direct")
ey <- fitted.values(fit.lo)
dhat[jj] <- ey[jj]
}
return(dhat)
}
dhat <- dhat2(x1, sp)
trhat <- sum(dhat)
sse <- sum(res^2)
cv <- sum((res/(1 - dhat))^2)/nd
gcv <- sse/(nd * (1 - (trhat/nd))^2)
return(gcv)
}
gcv <- lapply(as.list(span1), locvgcv, x1 = x1, y1 = y1)
#cvgcv <- unlist(cvgcv)
#cv <- cvgcv[attr(cvgcv, "names") == "cv"]
#gcv <- cvgcv[attr(cvgcv, "names") == "gcv"]
return(gcv)
}
そして私のデータで、私は次のことをしました:
nd <- length(Edge2$Distance)
xx <- Edge2$Distance
yy <- lcap
ntrial <- 50
span1 <- seq(from = 0.5, by = 0.01, length = ntrial)
output.lo <- locv1(xx, yy, nd, span1, ntrial)
#cv <- output.lo
gcv <- output.lo
plot(span1, gcv, type = "n", xlab = "span", ylab = "GCV")
points(span1, gcv, pch = 3)
lines(span1, gcv, lwd = 2)
gpcvmin <- seq(along = gcv)[gcv == min(gcv)]
spangcv <- span1[pgcvmin]
gcvmin <- cv[pgcvmin]
points(spangcv, gcvmin, cex = 1, pch = 15)
申し訳ありませんが、コードはかなりずさんです。これはRを使用する初めての試みの1つですが、単純な目視検査よりも客観的な方法で使用するのに最適なスパンを見つけるために、レス回帰のGSVを実行する方法のアイデアを提供する必要があります。上記のプロットでは、関数を最小化するスパン(プロットされた「曲線」で最も低い)に関心があります。