【问题标题】:Troubles predicting fixed effects from a hierarchical GAM in mgcv从 mgcv 中的分层 GAM 预测固定效应的麻烦
【发布时间】:2021-07-19 09:18:31
【问题描述】:

我一直在 R 中使用 mgcv 拟合不同的分层 GAM(以下简称:HGAM)。我可以毫无问题地提取和绘制它们的随机效应预测。相反,提取和绘制他们对固定效应的预测仅适用于某些模型,我不知道为什么。

这是一个实际示例,它指的是在不同地点采样的两个物种 (Taxon) 的花的色谱(也讨论了here):

rm(list=ls()) # wipe R's memory clean
library(pacman) # load packages, installing them from CRAN if needed
p_load(RCurl) # allows accessing data from URL
ss <- read.delim(text=getURL("https://raw.githubusercontent.com/marcoplebani85/datasets/master/flower_color_spectra.txt"))
head(ss)
ss$density <- ifelse(ss$density<0, 0, ss$density) # set spurious negative reflectance values to zero
ss$clr <- ifelse(ss$Taxon=="SpeciesB", "red", "black")
ss <- with(ss, ss[order(Locality, wl), ])

这些是两个物种在种群水平上的平均色谱(使用了滚动方式):

每种颜色代表不同的物种。每行代表不同的地区。

以下模型是根据Pedersen et al.'s classification (2019) 的 G 型 HGAM,它没有给出任何问题:

gam_G1 <- bam(density ~ Taxon # main effect
        + s(wl, by = Taxon, k = 20) # interaction
        + s(Locality, bs="re"), # "re" is short for "random effect"
        data = ss, method = 'REML',
        family="quasipoisson"
        )
# gam.check(gam_G1)
# k.check(gam_G1)   
# MuMIn::AICc(gam_G1)
# gratia::draw(gam_G1)
# plot(gam_G1, pages=1)

# use gam_G1 to predict wl by Locality

# dataset of predictor values to estimate response values for:    
nn <- unique(ss[, c("wl", "Taxon", "Locality", "clr")])
# predict:
pred <- predict(object= gam_G1, newdata=nn, type="response", se.fit=T)
nn$fit <- pred$fit
nn$se <- pred$se.fit

# use gam_G1 to predict wl by Taxon
    
# dataset of predictor values to estimate response values for:
nn <- unique(ss[, c("wl", 
                "Taxon", 
                "Locality",
                "clr")])
nn$Locality=0 # turns random effect off
# after https://stats.stackexchange.com/q/131106/214127

# predict:
pred <- predict(object = gam_G1, 
                type="response", 
                newdata=nn, 
                se.fit=T)
nn$fit <- pred$fit
nn$se <- pred$se.fit

R 警告我 factor levels 0 not in original fit,但它执行任务没有问题:

左面板:gam_G1Locality 级别的预测。右图:gam_G1 对固定效应的预测。

麻烦的模型

以下模型是“GI”类型的 HGAM sensu Pedersen et al. (2019)。它在Locality 级别产生更准确的预测,但我只能得到NA 作为固定效应级别的预测:

# GI: models with a global smoother for all observations, 
# plus group-level smoothers, the wiggliness of which is estimated individually 
start_time <- Sys.time()
gam_GI1 <- bam(density ~ Taxon # main effect
        + s(wl, by = Taxon, k = 20) # interaction
        + s(wl, by = Locality, bs="tp", m=1)
        # "tp" is short for "thin plate [regression spline]"
        + s(Locality, bs="re"),
        family="quasipoisson",
        data = ss, method = 'REML'
        )
end_time <- Sys.time()
end_time - start_time # it took ~2.2 minutes on my computer
# gam.check(gam_GI1)
# k.check(gam_GI1)
# MuMIn::AICc(gam_GI1)

尝试根据gam_GI1 绘制固定效应(Taxonwl)的预测:

# dataset of predictor values to estimate response values for:
nn <- unique(ss[, c("wl", 
                "Taxon", 
                "Locality",
                "clr")])
nn$Locality=0 # turns random effect off
# after https://stats.stackexchange.com/q/131106/214127

# predict:
pred <- predict(object = gam_GI1, 
                type="response", 
                # exclude="c(Locality)", 
                # # this should turn random effect off
                # # (doesn't work for me)
                newdata=nn, 
                se.fit=T)
nn$fit <- pred$fit
nn$se <- pred$se.fit
head(nn)
#       wl    Taxon Locality clr fit se
# 1 298.34 SpeciesB        0 red  NA NA
# 2 305.82 SpeciesB        0 red  NA NA
# 3 313.27 SpeciesB        0 red  NA NA
# 4 320.72 SpeciesB        0 red  NA NA
# 5 328.15 SpeciesB        0 red  NA NA
# 6 335.57 SpeciesB        0 red  NA NA

左面板:gam_GI1Locality 级别的预测。右面板(空白):gam_GI1 对固定效应的预测。

以下模型,包括所有观察的全局平滑器,加上组级平滑器,都具有相同的“摆动”,也不提供固定效应预测:

gam_GS1 <- bam(density ~ Taxon # main effect
        + s(wl, by = Taxon, k = 20) # interaction
        + s(wl, by = Locality, bs="fs", m=1),
        # "fs" is short for "factor-smoother [interaction]"
        family="quasipoisson",
        data = ss, method = 'REML'
        )

为什么gam_GI1gam_GS1 不对其固定效应进行预测,我如何获得它们?


模型可能需要几分钟才能运行。为了节省时间,他们的输出可以从here 下载为 RData 文件。我的 R 脚本(包括绘制图形的代码)可在here 获得。

【问题讨论】:

标签: r hierarchical-data mixed-models gam mgcv


【解决方案1】:

我认为您在这里混淆了几件事; by 关闭随机效果的技巧仅适用于 bs = "re" 平滑。 Locality 是一个因素(否则您的随机效应不是随机截距)并将其设置为 0 正在创建一个新级别(尽管它可能会创建一个 NA,因为 0 不在原始级别中。

如果您想要关闭与Locality 相关的任何内容,则应使用exclude;但是你有错误的调用。它不起作用的原因是因为您正在创建一个具有单个元素 "c(Locality)" 的字符向量。一旦您意识到c(Locality) 与您的模型中的任何内容都没有关系,这显然会失败。您需要在此处提供一个平滑名称的向量summary() 打印。例如,要排除平滑的s(Locality, bs = "re"),{mgcv} 知道这是s(Locality),所以你会使用exclude = "s(Locality)"

在您的情况下,为每个平滑输入所有 "s(wl):LocalityLevelX" 标签是很乏味的。由于您只有两个分类单元,因此使用免费参数terms 会更容易,您可以在其中列出要在模型中包含的平滑标签。所以你可以为这些平滑做terms = c("s(wl):TaxonSpeciesB", "s(wl):TaxonSpeciesC")summary() 显示的任何内容。

您还需要在terms 中包含Taxon 术语,我认为需要这样做:

terms = c("TaxonSpeciesB", TaxonSpeciesC", 
          "s(wl):TaxonSpeciesB", "s(wl):TaxonSpeciesC")

如果您安装并加载我的 {gratia} 包,您可以使用 smooths(gam_GI1) 列出 {mgcv} 知道的所有平滑标签。

by 技巧的工作原理如下:

gam(y ~ x + s(z) + s(id, bs = "re", by = dummy)

其中dummy 在拟合时设置为数字1,在您进行预测时设置为0。由于这是一个 numeric 变量,因此您将平滑乘以 dummy,因此为什么将其设置为 0 会排除该术语。您的代码无法正常工作的原因是因为您真的想要为每个wl 单独平滑LocalityLocality 是您的数据/模型中感兴趣的实际变量,而不是我们为实现从模型中排除术语的目的而创建的虚拟变量。

希望现在您能明白为什么 excludeterms 是比 dummy 技巧更好的解决方案。

仅供参考,在bs = "tp" 中,"tp" 并不意味着张量积平滑。这意味着薄板回归样条(TPRS)。您只能通过 te()t2()ti() 术语获得张量积平滑。

【讨论】:

  • 谢谢! terms 就像一个魅力。无论使用terms = c("s(wl):TaxonSpeciesA", "s(wl):TaxonSpeciesB") 还是terms = c("TaxonSpeciesA", "TaxonSpeciesB", "s(wl):TaxonSpeciesA", "s(wl):TaxonSpeciesB"),结果看起来都是一样的。也感谢您澄清"tp" 的含义。
  • 啊,所以它会自动包含所有参数项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2019-02-15
  • 2016-01-07
相关资源
最近更新 更多