我如何决定在 R 的 LOESS 回归中使用什么跨度?

机器算法验证 r 回归 黄土
2022-01-22 02:08:10

我在 R 中运行 LOESS 回归模型,我想比较 12 个不同样本大小的不同模型的输出。如果有助于回答问题,我可以更详细地描述实际模型。

以下是样本大小:

Fastballs vs RHH 2008-09: 2002
Fastballs vs LHH 2008-09: 2209
Fastballs vs RHH 2010: 527 
Fastballs vs LHH 2010: 449

Changeups vs RHH 2008-09: 365
Changeups vs LHH 2008-09: 824
Changeups vs RHH 2010: 201
Changeups vs LHH 2010: 330

Curveballs vs RHH 2008-09: 488
Curveballs vs LHH 2008-09: 483
Curveballs vs RHH 2010: 213
Curveballs vs LHH 2010: 162

LOESS回归模型是一个表面拟合,其中每个棒球场的X位置和Y位置用于预测sw,摆动打击概率。但是,我想在所有 12 个模型之间进行比较,但是设置相同的跨度(即跨度 = 0.5)会产生不同的结果,因为样本量范围很广。

我的基本问题是如何确定模型的跨度?较高的跨度使拟合更加平滑,而较低的跨度捕获更多趋势,但如果数据太少,则会引入统计噪声。我对较小的样本量使用较高的跨度,对较大的样本量使用较低的跨度。

我该怎么办?在 R 中为 LOESS 回归模型设置跨度时,有什么好的经验法则?提前致谢!

4个回答

如果目标是找到具有最低 RMSEP 的拟合,则通常使用交叉验证,例如k倍。将您的数据分成k组,依次将每个组排除在外,使用k -1 组数据和选定的平滑参数值拟合一个黄土模型,并使用该模型来预测被排除在外的组。存储遗漏组的预测值,然后重复,直到k个组中的每一个都被遗漏一次。使用一组预测值,计算 RMSEP。然后为您希望调整的平滑参数的每个值重复整个过程。选择在 CV 下给出最低 RMSEP 的平滑参数。

如您所见,这在计算上相当繁重。如果没有可以与 LOESS 一起使用的真实 CV 的广义交叉验证 (GCV) 替代方案,我会感到惊讶 - Hastie 等人(第 6.2 节)表明这很容易做到,并且在他们的一个练习中有所介绍.

我建议你阅读 Hastie 等人的第 5 章中的第 6.1.1、6.1.2 和 6.2 节,以及平滑样条的正则化部分(内容也适用于此处)。(2009)统计学习的要素:数据挖掘、推理和预测第 2 版。施普林格。PDF可以免费下载。

我建议检查广义加法模型(GAM,请参阅 R 中的 mgcv 包)。我自己只是在了解它们,但它们似乎会自动弄清楚数据证明了多少“摇摆不定”。我还看到您正在处理二项式数据(罢工与非罢工),因此请务必分析原始数据(即不要按比例汇总,使用原始的音高数据)并使用 family= “二项式”(假设您要使用 R)。如果您有关于单个投手和击球手对数据的贡献的信息,您可能可以通过执行广义加法混合模型(GAMM,请参阅 R 中的 gamm4 包)并将投手和击球手指定为随机效应(再次,设置family='二项式')。最后,您可能希望允许 X 和 Y 的平滑之间进行交互,但我自己从未尝试过,所以我不知道该怎么做。没有 X*Y 交互的 gamm4 模型如下所示:

fit = gamm4(
    formula = strike ~ s(X) + s(Y) + pitch_type*batter_handedness + (1|pitcher) + (1|batter)
    , data = my_data
    , family = 'binomial'
)
summary(fit$gam)

想一想,你可能想让平滑度在每个音高类型和击球手习惯的水平上有所不同。这使问题变得更加困难,因为我还没有发现如何让平滑随多个变量而变化,从而产生有意义的分析测试(请参阅我对 R-SIG-Mixed-Models 列表的查询)。你可以试试:

my_data$dummy = factor(paste(my_data$pitch_type,my_data$batter_handedness))
fit = gamm4(
    formula = strike ~ s(X,by=dummy) + s(Y,by=dummy) + pitch_type*batter_handedness + (1|pitcher) + (1|batter)
    , data = my_data
    , family = 'binomial'
)
summary(fit$gam)

但这不会对平滑度进行有意义的测试。在尝试自己解决这个问题时,我使用了引导重采样,在每次迭代中,我获得了整个数据空间的模型预测,然后计算空间中每个点的引导 95% CI 以及我关心计算的任何效果。

对于黄土回归,我作为非统计学家的理解是,您可以根据视觉解释选择跨度(具有大量跨度值的图可以选择看起来合适的平滑量最少的图),或者您可以使用交叉验证(CV) 或广义交叉验证 (GCV)。下面是我用于黄土回归的 GCV 的代码,该代码基于 Takezawa 的优秀书籍Introduction to Nonparametric Regression(来自 p219)中的代码。

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,以比简单的视觉检查更客观的方式找到最佳跨度。在上图中,您对最小化函数的跨度感兴趣(绘制的“曲线”上的最低值)。

如果您切换到通用加法模型,您可以使用mgcv包中的gam()函数,作者在其中向我们保证

因此,k 的精确选择通常不是关键:它应该选择得足够大,以便您有理由确信有足够的自由度来合理地很好地表示潜在的“真相”,但要足够小以保持合理的计算效率。显然,“大”和“小”取决于正在解决的特定问题。

k这里是平滑器的自由度参数,类似于黄土的平滑度参数)