哪种方法是正确的?(广义相加模型,mgcv)

机器算法验证 r 时间序列 数据可视化 广义加法模型 毫克CV
2022-03-21 11:37:27

如果可能的话,请让我知道我是否在正确的轨道上?我不认识任何与 GAM 合作的人,我可以问他们,我会非常感谢我收到的任何帮助。我在 R 中使用 mgcv。

我的数据是每天的花数('Total'),不同的植物基因系('RIL')和 4 种不同的处理方法('Trt')。我基本上想比较这 4 种处理方法,看看它们之间的花产量是否随着时间的推移而存在差异。开花曲线的形状是否不同?

我的游戏的一个例子:

gam1 <- gam(Total ~ Trt * RIL + s(DateNum, k = 9, bs = "fs") + s(Plant, bs = "re"), data=ce1230)

我知道使用 anova.gam(gam1) 我可以查看治疗和 rils 之间是否存在显着差异。但是,当我绘制 gam1 时,它会显示一条代表一切的曲线。我希望看到我的 4 种治疗中的每一种都有单独的曲线图。这是否意味着我需要制作 gamtrt1、gamtrt2、gamtrt3、gamtrt4 并以某种方式将单独的游戏相互比较?还是使用原始的 anova(gam1) 并单独绘制每个处理?还是我以完全错误的方式看待这个?

3个回答

我会首先尝试方差分析并查看该 F 检验。如果它拒绝,则有证据表明治疗之间存在差异。在那之后,由于你的结果是计算数据,我会做一个泊松回归。与难以测试影响重要性的 GAM 不同,泊松回归为您提供通常的 p 值,这使您可以轻松查看哪些因素对导致数据差异很重要。

https://stats.idre.ucla.edu/r/dae/poisson-regression/

如果您的均值和方差之间存在显着差异(泊松说它们应该相同),请使用 Poisson-Gamma 模型修改泊松回归。

我猜你by想要s. 然后,生成的一组图对于by因子的每个水平都有一个。在这个示例中?gam.models,有 3 个级别fac,因此有 3 个图x2和 1个图x0

dat <- gamSim(4)
b <- gam(y ~ fac + s(x2, by=fac) + s(x0), data=dat)
plot(b, pages=1)

在此处输入图像描述

您的数据有问题;您不能将随机效应Plant作为一个因素获得您在@Aaron's Answer的评论链接中显示的情节。你确定这Plant是一个超过1级的因素吗?如果没有,您需要正确编码数据以获得每株植物的随机截距。另外,你能同时包含RILPlant水平效果吗?一旦你考虑了单独的Plant影响(截距),那在逻辑上不也能解释基因系的影响吗?

其次,如果使用bs = 'fs',则需要传入一个连续变量一个因子;到目前为止,您只能通过DateNum此刻你有

s(DateNum, k = 9, bs = "fs")

我想你想要

s(DateNum, Trt, k = 9, bs = "fs")

这个模型类似于@Aaron 提出的模型,但在细节上有些不同。完整的模型可能是

gam(Total ~ Trt * RIL + s(DateNum, Trt, k = 9, bs = "fs") + s(Plant, bs = "re"),
    data=ce1230)

但我怀疑那是错误的?(对于fs平滑,您不需要参数Trt。)所以我认为,

gam(Total ~ RIL + Trt:RIL + s(DateNum, Trt, k = 9, bs = "fs") + 
    s(Plant, bs = "re"), data=ce1230)

其中的主要效果Trt实际上包含在fs平滑中,因此我们不对其进行参数指定。

该模型与@Aaron 的主要区别在于,对于DateNumby的平滑,有一个平滑参数Trt,而在@Aaron 的回答中,每个平滑都有自己的平滑参数。这归结为您是否期望每个平滑的相似摆动(平滑的形状可能不同)或您是否希望四个平滑中的一些比其他平滑更摆动?

您似乎想要的是每个 之间的交互RILTrt加上单独的平滑Trt但是你想要每个RILTrt组合的单独平滑吗?这将需要一个单独的变量,由数据中的RILTrt可用的组合形成:

ce1230 <- transform(ce1230, 
                    RILTrt = interaction(RIL, Trt, drop = TRUE))

然后你可以适应

gam(Total ~ s(DateNum, RILTrt, k = 9, bs = "fs") + 
    s(Plant, bs = "re"), data=ce1230)

或者

gam(Total ~ s(DateNum, k = 9, by = RILTrt) + 
    s(Plant, bs = "re"), data=ce1230)

取决于您bs = 'fs'是否by希望DateNum.

该模型还需要尊重响应的非负面性质;你有计数,你不能有任何负数。使用family = poissonfamily = nb将是合理的起点。