平滑处理 GAMLSS 中的模型诊断是否合适?

机器算法验证 r 平滑 无游戏
2022-03-21 13:38:34

我最近才开始使用 GAMLSS 模型(在这个问题中指出了那个方向之后),我想知道使用平滑(即在我的情况下为三次样条)处理不令人满意的蠕虫图是否“合法”(我知道如何这听起来,这就是为什么我将这个问题发布到我们的统计天才社区)。

我正在分析一个收获数据集,并试图找出哪些参数会影响狩猎成功,以及过去 20 年的收获是否呈递减趋势。我的数据是每天收获的鸟类数量,并且我有解释每日收获变化的协变量(努力:狩猎的小时数;每天在保护区出现的鸟类数量,秋季飞行中幼鸟的比例(年度协变量) )。

我之所以使用gamlss,是因为可用于模型拟合的多种分布,并且因为它允许我根据一些参数(在我的情况下为努力和年份 - 收获随着时间的推移而变化越来越小)对收获中的方差(sigma)进行建模)。

以下是数据集的摘录:

   year   day   date       harvest inventory YAratio hours
   <dbl> <dbl> <date>       <dbl>    <dbl>    <dbl>  <dbl>
1  2000   276 2000-10-02      96     23000      26   76.5
2  2000   277 2000-10-03      95     21500      26   139. 
3  2000   278 2000-10-04     323     26000      26   143  
4  2000   279 2000-10-05     356     16500      26   135. 

我进行了模型选择以确定最适合我的数据的分布,并采用泊松逆高斯分布。

这是我要拟合的模型:

gamlss(harvest ~ YAratio + inventory + offset(log(hours)) + random(factor(year)),
         sigma.formula = harvest ~ offset(log(hours))+random(factor(year)),
         data = dataframe, 
         family = PIG)

我的问题是我从这个模型中得到了不令人满意的蠕虫图,特别是在查看库存变量时(如果这改变了任何东西,它会变化很大)。这是使用命令获得的蠕虫图

wp(mod, xvar=dataframe$inventory, n.inter=4)

在此处输入图像描述

许多点落在虚线之外(据我所知,这意味着由蠕虫图表示的解释变量部分的模型违规,其中点在线上)。我认为平滑可以让模型更灵活地处理库存数据,所以我在模型中添加了一个三次样条项,如下所示:

gamlss(harvest ~ YAratio + cs(inventory, 3) + offset(log(hours)) + random(factor(year)),
         sigma.formula = harvest ~ offset(log(hours))+random(factor(year)),
         data = dataframe, 
         family = PIG)

这会产生以下蠕虫图(更好):

在此处输入图像描述

GAIC也支持此模型(原始模型为-12点)。那么我的问题是:这是处理我的虫图问题的合法方法吗?两个模型之间的模型估计非常相似,并且后一个模型的预测(通过从模型估计中模拟数据获得的 CI)与原始数据非常吻合:

在此处输入图像描述

谢谢您的帮助!

2个回答

正如Gustavo Thomas 等人在使用 GAMLSSs 的纵向多级实验分析一文中所解释的那样,整体和特定于预测器的蠕虫图具有“不同的形状表示模型中的不同不足”的特征: https ://arxiv.org/pdf /1810.03085.pdf

灵活回归和平滑一书的第 12.4 节:在 R 中使用 GAMLSS里格比等人。值得一读,因为它全面介绍了如何解释蠕虫图。该部分以这些陈述结束:“一般来说,建立一个没有不合适区域的模型可能并不总是可能的。” “无论如何,当使用具有许多不合适区域的模型来支持结论时,需要格外小心。”。然而,校准被提到作为一种解决方案,以最大限度地减少失配。

如何纠正模型不匹配取决于蠕虫图中检测到的问题的性质。如果这些问题表明需要考虑您的连续预测变量之一的非线性效应以改善模型拟合,那么您将需要对该预测变量的效应进行非线性建模而不是线性建模。(其他类型的校正可能涉及给定模型中的预测变量和随机效应,为响应变量指定不同类型的分布,省略或包括模型各个部分的预测变量,转换预测变量等)

请注意,根据 cs() 函数的帮助文件:

函数 scs() 与函数 cs() 的不同之处在于它允许对平滑参数进行交叉验证,这与固定有效自由度 df 的 cs() 不同。请注意,推荐的平滑函数现在是函数 pb(),它允许使用局部最大似然估计平滑参数。函数 pb() 基于 Eilers 和 Marx (1996) 的惩罚 beta 样条 (P-splines)。

因此,您可能需要考虑在模型中使用 pb() 而不是 cs()。

附录:

这是一些 R 代码,用于为模型生成数据,其中二次拟合比线性甚至平滑拟合更好。它将帮助您对蠕虫图的外观建立一些直觉。数据是根据https://www.theanalysisfactor.com/r-tutorial-4/生成的。

14, 15, 16, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30), 
Outcome = c(126.6, 101.8, 71.6, 101.6, 68.1, 62.9, 45.5, 41.9, 
46.3, 34.1, 38.2, 41.7, 24.7, 41.5, 36.6, 19.6, 
22.8, 29.6, 23.5, 15.3, 13.4, 26.8, 9.8, 18.8, 25.9, 19.3)), 
.Names = c("Time", "Outcome"),
row.names = c(1L, 2L, 3L, 5L, 7L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 19L, 20L, 21L, 22L, 23L, 25L, 26L, 27L, 28L, 29L, 30L, 31L),
class = "data.frame")

Data

数据的标题如下所示:

  Time Outcome
1    0   126.6
2    1   101.8
3    2    71.6
5    4   101.6
7    6    68.1
9    8    62.9```

The plot of the Outcome variable versus the predictor variable Time can be obtained with:

```library(ggplot2)
theme_set(theme_bw())

ggplot(Data, aes(x = Time, y = Outcome)) + 
geom_point(size=3, colour="dodgerblue")

在此处输入图像描述

现在,在 gamlss 框架内为这些数据拟合 3 个可能的模型:

linear.model <- gamlss(Outcome ~ Time, data = Data, family=NO)
quadratic.model <- gamlss(Outcome ~ Time + I(Time^2), data = Data, family=NO)
smooth.model <- gamlss(Outcome ~ pb(Time), data = Data, family=NO)

summary(linear.model)
summary(quadratic.model)
summary(smooth.model)

比较 3 个拟合模型的(广义)AIC 值:

GAIC(linear.model, quadratic.model, smooth.model)

二次模型是“赢家”,因为它具有最小的 AIC 值:

                      df      AIC
quadratic.model 4.000000 197.0357
smooth.model    5.251898 197.8349
linear.model    3.000000 219.0893

现在为时间预测器构建蠕虫图:

wp(linear.model, xvar=Time)
wp(quadratic.model, xvar=Time)
wp(smooth.model, xvar=Time)

线性模型拟合的蠕虫图显示了一些失配问题: 在此处输入图像描述

二次和平滑模型拟合的蠕虫图看起来比线性模型拟合的蠕虫图好一点。

在此处输入图像描述

在此处输入图像描述

我们还可以直接根据时间预测器绘制模型残差:

Data$linear.model.residuals <- residuals(linear.model)
Data$quadratic.model.residuals <- residuals(quadratic.model)
Data$smooth.model.residuals <- residuals(smooth.model)

plot1 <- ggplot(Data, aes(x = Time, y = linear.model.residuals)) + 
         geom_point(size=3, colour="darkgrey") + 
         geom_hline(yintercept = 0, linetype=2, colour="red") + 
         ggtitle("Linear Model Residuals vs. Time") + 
         coord_cartesian(ylim=c(-3,3))


plot2 <- ggplot(Data, aes(x = Time, y = quadratic.model.residuals)) + 
         geom_point(size=3, colour="darkgrey") + 
         geom_hline(yintercept = 0, linetype=2, colour="red") +
         ggtitle("Quadratic Model Residuals vs. Time") + 
         coord_cartesian(ylim=c(-3,3))


plot3 <- ggplot(Data, aes(x = Time, y = smooth.model.residuals)) + 
         geom_point(size=3, colour="darkgrey") + 
         geom_hline(yintercept = 0, linetype=2, colour="red") +
         ggtitle("Smooth Model Residuals vs. Time") + 
         coord_cartesian(ylim=c(-3,3))

library(cowplot)

plot_grid(plot1, plot2, plot3, ncol=3)

在此处输入图像描述

最后这些图使我们更容易辨别线性模型的残差中存在二次模式,这需要在模型中加以考虑。

如果您愿意,您可以将线性模型的残差与时间图分开,并检查对应于相应蠕虫图中使用的时间间隔划分的图部分:

w.linear <- wp(linear.model, xvar=Time, main="Given: Time")
w.linear

在 w.linear 的 R 输出的 $classes 部分中报告了 Time 观察值范围划分的切点:

> w.linear
$classes
     [,1] [,2]
[1,] -0.5  8.5
[2,]  8.5 15.5
[3,] 15.5 24.5
[4,] 24.5 30.5

$coef
           [,1]        [,2]        [,3]        [,4]
[1,]  0.6061177  0.79644473  0.26190049 -0.29589027
[2,] -1.0467772 -0.54040972  0.08504976 -0.05550396
[3,] -0.1400464 -0.64524770 -0.15331613  0.02095304
[4,]  0.7161490 -0.03070935 -0.08930395 -0.19956330

这些切点是 -0.5、8.5、15.5、24.5 和 30.5。我们可以绘制残差与时间的关系,并仅为“中间”切点绘制垂直线:

plot11 <- ggplot(Data, aes(x = Time, y = linear.model.residuals)) + 
          geom_point(size=3, colour="darkgrey") + 
          geom_hline(yintercept = 0, linetype=2, colour="red") + 
          ggtitle("Linear Model Residuals vs. Time") + 
          coord_cartesian(ylim=c(-3,3)) + 
          geom_vline(xintercept = w.linear$classes[1,2], 
                 colour="blue", linetype=3, size=1.5) + 
      geom_vline(xintercept = w.linear$classes[2,2], 
                     colour="blue", linetype=3, size=1.5) +
          geom_vline(xintercept = w.linear$classes[3,2], 
                     colour="blue", linetype=3, size=1.5) 

plot11

这使我们可以放大特定的时间间隔并确定模型拟合在这些间隔中如何分解:

在此处输入图像描述

蠕虫图基本上是 qq 图,因此您正在做的是试图找到产生正态分位数残差的协变量的最佳函数形式。这表明更适合。

您检查了信息标准,还可以进行似然比检验。但是,如果模型具有更好的拟合度,三次样条就没有任何问题。

我还建议您使用拟合的 gamlss 对象上的绘图功能检查残差诊断。这将为您提供另一个视图,作为蠕虫图的补充。