如何使用 GLMM 对嵌套固定因子建模

机器算法验证 r 嵌套数据 lme4-nlme
2022-04-16 12:07:21

我是学习 GLMM 和 R 的初学者,如果我没有意义或提出一些非常基本的问题,请原谅我。

我试图在我的 GLMM 模型中指定一个嵌套的固定因子,但我似乎没有找到方法。如果有人能回答这个问题,我将不胜感激。

我的实验由四种不同的物种(A、B、C、D)组成,并且我使用了这四种物种的所有可能组合作为不同的处理方法(组成Compo,每个Compon = 4 ExpRun)。Compo因此嵌套在 内SPrich,因为Compo仅包含物种 A 只能在SPrich1 之下,而不能在其他之下。因此,我的数据在 factor 下不平衡SPrich例如:

SPrich  Compo(abbr.)
0       Control
1       A
1       B
1       C
1       D
2       AB
2       AC
2       AD
2       BC
2       BD
2       CD
3       ABC
...
4       ABCD

我很想知道物种丰富度SPrich(5 个级别)和组成Compo(16 个级别)是否对响应变量有影响,我在每个实验池中WaterChlA测量的结果都不同不是正态分布,而是更接近于对数正态分布,因此使用高斯链接对数。每个样本都是在 之间抽取的,因此它们不是独立的。我已经进行了 3 次实验,用 factor 表示在所有三个中都以不同的方式表示,因此是嵌套的随机因子。DayTankNoWaterChlATankNoDayExpRunTankNoExpRun

这是我要演示的数据的一部分:

> str(Wetland)
'data.frame':   480 obs. of  31 variables:
$ TankNo    : Factor w/ 150 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
$ ExpRun    : Factor w/ 3 levels "1","2","3": 2 2 2 2 2 2 2 2 2 2 ...
$ Day       : Factor w/ 4 levels "1","8","15","22": 1 1 1 1 1 1 1 1 1 1 ...
$ SPrich    : Ord.factor w/ 5 levels "0"<"1"<"2"<"3"<..: 1 1 1 1 2 2 2 2 2 2 ...
$ FxRich    : Ord.factor w/ 3 levels "0"<"1"<"2": 1 1 1 1 2 2 2 2 2 2 ...
$ Compo     : Factor w/ 16 levels "1","2","3","4",..: 1 1 1 1 2 2 2 2 3 3 ...
$ MIFI      : Factor w/ 2 levels "0","1": 1 1 1 1 2 2 2 2 1 1 ...
$ KAPU      : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 2 2 ...
$ DUME      : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ POME      : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ WaterChlA : num  8.33 1.99 35.56 17.49 22.04 ...

问题来了,因为我的固定因子Compo应该嵌套在SPrich其中,但似乎在 glmm 中嵌套随机因子更常见,而且我还没有遇到过如何嵌套固定因子。我在 Bolker 教授的 Github 帖子中读到,A/B在 R 中指定实际上等于1 + A + A:B,但我想知道这样写是否足以指定和之间的嵌套SPrichCompo如下所示)?如果不是,那么指定嵌套的正确方法应该是什么CompoSPrich

我将以下内容输入到模型中以glmer使用 package运行lme4

glmm1 <- glmer(WaterChlA ~ ExpRun + Day + SPrich/Compo + ExpRun*Day + ExpRun*SPrich + 
ExpRun*SPrich/Compo + Day*SPrich + Day*SPrich/Compo + (1|ExpRun/TankNo), data = Wetland, 
family = gaussian(link = "log"), na.action = na.exclude)

它说:

fixed-effect model matrix is rank deficient so dropping 404 columns / coefficients

这是可以理解的,因为我的固定因子不是满秩而是嵌套的,所以如果它必须删除不存在的系数组合,我不会太惊讶。但是,它有点表明上面指定的模型并没有真正考虑到嵌套性(?)。它也未能收敛:

Warning messages:
1: In (function (fn, par, lower = rep.int(-Inf, n), upper = rep.int(Inf,  :
  failure to converge in 10000 evaluations
2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
  Model failed to converge with max|grad| = 0.112084 (tol = 0.001, component 1)

我想知道我指定嵌套的方式Compo是否SPrich正确。我也想知道 GLMM 是否是分析这类数据最合适的方法,或者有没有其他更合适的工具,也许 GLM 足以分析我的数据?我选择 GLMM 是因为不同坦克之间存在相当大的差异,因此掩盖了感兴趣因素的影响,将TankNo其视为随机因素应该有助于降低影响。

除了SPrich,我也有兴趣看看功能丰富度FxRich如何影响响​​应,但Compo嵌套在内部FxRich不同于内部SPrich(比如CompoA & B 是相同的功能组,C & D 是另一个,那么CompoAB 将是SPrich2 和FxRich1,而CompoAC 将是SPrich2 和FxRich2,因此嵌套非常不同且复杂),我认为稍后在另一个不包含SPrichor的模型中解决这个问题更明智Compo我想知道这是否合理?也许这应该进入另一个问题线程并稍后讨论......

谢谢大家的关注!真的很感谢上面的任何想法!

1个回答

意识流:

  • 您可能需要考虑对响应进行日志转换(前提是没有零),而不是使用日志链接,即,lmer(log(WaterChlA) ~ ...)而不是glmer(WaterChla ~ ..., family=gaussian(link="log")); 我这样说是因为对数转换可以处理响应中的异方差性(特别是与预期平均值大致成比例的标准偏差),而对数链接方法没有做到这一点(而且,lmer往往更快一点,并且比glmer)更稳定
  • 嵌套固定效应确实很难在线性模型中指定(与 ANOVA 框架相反),其中底层框架明确地试图估计参数,而不仅仅是评估平方和/方差比例的解释。如果参数不是唯一可识别的,那么模型最终会删除一些项。如果您的实验设计不允许,您根本无法估计交互作用,这对于嵌套项是必需的。例如,您无法判断物种丰富度之间的影响如何Compo=AB变化,因为Compo=AB仅在物种丰富度为 2 时存在。您还有一个问题:您甚至无法Compo在模型中唯一地估计物种丰富度的影响,因为Compo与物种丰富度是多余的(一旦你知道Compo,你就知道物种丰富度)。这种冗余在方差分解方法或贝叶斯模型中是允许的,但在基于参数估计的线性模型和源自它们的模型中却不允许。您可以制作Compo随机效果(这也是一个很好的建模策略,因为它有很多级别,这在自由度方面会很昂贵);这仍然可以让您量化效果。
  • 由于您有 480 个数据点,因此您应该牢记经验法则(例如来自 Harrell 的回归建模策略),即您不应该尝试拟合具有最多n/10 = 48 个参数的模型(这是极端的 - 通常是规则表示为 n/20,这意味着 24 个参数)。因为您的预测变量都是因素,所以试图估计它们之间的相互作用会迅速使您的模型大小爆炸。
  • lme4已知在某些情况下会发出假阳性收敛警告,但在这种情况下它们看起来是真实的;我认为问题在于您的模型过度指定/过于复杂......看看是否将其剥离(如下所示)有帮助。
  • 通常,您不应该将分类变量(因子)作为固定效应和随机效应分组变量包括在内:这是一个冗余模型规范。

我会说这个模型的一个合理的开始是

lmer(log(WaterChlA) ~ Day*SPrich + (1|Compo) + (1|ExpRun/TankNo),
 data = Wetland, na.action = na.exclude)

虽然试图估计DaySPrich给你20个参数之间的相互作用,这有点推动它。您可能会考虑是否愿意将这些因素中的一个或两个转换为数字(即只寻找线性趋势,或者如果您使用poly(Day,SPrich,degree=2)它会给您只有 5 个参数的二次项......)