황토 회귀 분석의 경우 비 통계 학자로서의 이해는 시각적 해석을 기반으로 스팬을 선택할 수 있고 (스팬 값이 여러 개인 플롯은 적절하게 보이는 스무딩이 가장 적은 플롯을 선택할 수 있음) 교차 검증을 사용할 수 있다는 것입니다 (CV) 또는 일반화 된 교차 검증 (GCV). 아래는 Takezawa 의 훌륭한 저서 인 비모수 적 회귀 소개 (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을 사용한 첫 번째 사례 중 하나입니다. 단순한 육안 검사보다 더 객관적인 방식으로 사용할 최상의 범위를 찾기 위해 황토 회귀에 대해 GSV를 수행하는 방법에 대한 아이디어를 제공해야합니다. 위 그림에서 함수를 최소화하는 범위에 관심이 있습니다 (플롯 된 "곡선"에서 가장 낮음).