具有比例数据的 mgcv 中的错误 运行 二项式 GAM

Error running binomial GAM in mgcv with proportional data

我正在尝试 运行 基于比例数据(0 到 1 之间的数字)的 GAM。但我收到警告

In eval(family$initialize) : non-integer #successes in a binomial glm!

基本上我正在模拟适应温暖的物种的出现次数与适应温暖和寒冷的物种的总出现次数与海面温度的关系,并使用来自另一个天气系统 (NAO) 的数据作为随机效应,以及其他三个分类, 参数, 变量。

m5 <- gam(prop ~ s(SST_mean) + s(NAO, bs="re") + WarmCold + Cycle6 + Region, 
          family=binomial, data=DAT_WC, method = "REML")

prop = 发生的比例,WarmCold = 物种是热适应还是冷适应,Cycle6 = 6 年时间段,Region = 4 个区域之一。我的数据集示例如下

structure(list(WarmCold = structure(c(1L, 1L, 1L, 1L, 2L, 2L), .Label = c("Cold", 
"Warm"), class = "factor"), Season = structure(c(2L, 2L, 2L, 
2L, 2L, 2L), .Label = c("Autumn", "Spring", "Summer", "Winter"
), class = "factor"), Region = structure(c(1L, 2L, 3L, 4L, 1L, 
2L), .Label = c("OSPARII_N", "OSPARII_S", "OSPARIII_N", "OSPARIII_S"
), class = "factor"), Cycle6 = structure(c(1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("1990-1995", "1996-2001", "2002-2007", "2008-2013", 
"2014-2019"), class = "factor"), WC.Strandings = c(18L, 10L, 
0L, 3L, 5L, 25L), SST_mean = c(7.4066298185553, 7.49153086390094, 
9.28247524767124, 10.8654859624361, 7.4066298185553, 7.49153086390094
), NAO = c(0.542222222222222, 0.542222222222222, 0.542222222222222, 
0.542222222222222, 0.542222222222222, 0.542222222222222), AMO = c(-0.119444444444444, 
-0.119444444444444, -0.119444444444444, -0.119444444444444, -0.119444444444444, 
-0.119444444444444), Total.Strandings = c(23, 35, 5, 49, 23, 
35), prop = c(0.782608695652174, 0.285714285714286, 0, 0.0612244897959184, 
0.217391304347826, 0.714285714285714)), row.names = c(NA, 6L), class = "data.frame")

从文献(Zuur,2009)看来,二项分布似乎最适合比例数据。但它似乎没有用。它是 运行ning 但给出了上述警告,并且输出没有意义。我在这里做错了什么?

这是警告,不是错误,但确实表明有些地方不正确;二项分布支持非负整数值,因此在没有形成比例的样本总数的情况下传递非整数值没有意义。

您可以使用 weights 参数执行此操作,在本例中,该参数应采用整数向量,其中包含计算比例的每个观察值的总数。

或者,如果均值-方差关系适合您的数据,请考虑使用 family = quasibinomial;变暖会消失,但你将无法使用 AIC 和相关工具,这些工具预计会有真正的可能性。

如果您的比例是真实比例,则考虑 family = betar 来拟合 beta 回归模型,其中响应的条件分布支持单位区间 (0, 1) 上的实数值(但技术上不支持0 或 1 — 如果响应中有 0 或 1 个值,mgcv 将添加或减去一个小数字以调整数据)。

我还发现不是计算总数,而是将 cbind() 与感兴趣的 2 列一起使用删除了警告,例如

m8 <- gam(cbind(WC.Strandings, Total.Strandings) ~ s(x1) + x2, 
family=binomial(link="logit"), data=DAT, method = "REML")