我正在尝试使用 R 函数
glmmTMB::glmmTMB()
将广义线性混合效应模型拟合到数据集。但是,我收到一条警告,上面写着 Warning message: In (function (start, objective, gradient = NULL, hessian = NULL, : NA/NaN function evaluation
。我不确定这个警告是否重要或如何解决。
两个注意事项:
glmmTMB
故障排除小插图(位于页面底部附近的“NA/NaN 函数评估”下)中显示的文本相似但不同。我不确定这些是否是相同的警告,但文本略有不同。链接:https://cran.r-project.org/web/packages/glmmTMB/vignettes/troubleshooting.htmlcontrol = glmmTMBControl(rank_check = "adjust")
时包含推荐的参数 (glmmTMB()
) 对此警告没有影响。链接:R 中 glmmTMB 函数的问题:总结为 NaN 下面提供了一个可重现的示例。文件“testing_insect_abund2.csv”可以通过以下链接从 GitHub 下载:https://github.com/albrechtcf/SO_glmm_warning_data/blob/main/testing_insect_abund2.csv
这些数据是一系列调查样方中特定昆虫物种(数量/公顷)的丰度(整数计数)。调查在三个研究地点(即三个相距至少 40 公里的独立森林地区)进行。在每个研究地点内,样方被排列成与六个单独的森林冠层间隙相关的三重组(即,每个研究地点的六个树冠间隙中的每一个都有三个样方,每个地点总共有 18 个样方,或者所有地点总共有 54 个样方)。每一行对应一个调查样方。包括环境数据(海拔、森林冠层开放度和森林断面积)。请注意,这是我的实际数据集格式的虚拟数据集 - 变量名称和值已被编辑以确保数据安全。
变量定义:
study_site
:进行调查的一般区域。具有三个级别的分类变量。
canopy_gap_ID
:每个冠层间隙的标识符。分类变量。值不一定是唯一的(例如,冠层间隙 ID = 2 对于研究地点 #1 和研究地点 #3 中的样方均成立)。
elevation
:样方相对于基线值的高程 (m)。负值不低于海平面,仅低于视为零的任意海拔。连续变量。
canopy_openness
:衡量森林树冠开放程度的指标(以百分比表示,0% 表示完全关闭,100% 表示根本没有树冠)。连续变量。
ba_total
:样方周围的森林断面积(每公顷树木横截面的平方米)。整数。
abund
:物种丰度(数量/公顷)。整数。
控制台:
> library(glmmTMB)
> library(tidyverse)
> dataIN <- read.csv("testing_insect_abund2.csv") %>%
+ dplyr::mutate(canopy_gap_ID = as.factor(canopy_gap_ID))
> head(dataIN)
study_site canopy_gap_ID elevation canopy_openness ba_total abund
1 studysite1 2 -19.134308 31.952001 20 0
2 studysite1 2 -33.968140 7.531575 80 0
3 studysite1 2 -52.965713 9.731771 50 257
4 studysite1 3 8.137726 16.040343 90 0
5 studysite1 3 -3.274323 7.346171 100 0
6 studysite1 3 -10.232712 6.932909 90 0
> glmmTMB(abund ~ elevation + canopy_openness + ba_total + elevation*canopy_openness + (1 | study_site:canopy_gap_ID),
+ family = poisson(link = "log"),
+ data = dataIN)
Formula: abund ~ elevation + canopy_openness + ba_total + elevation * canopy_openness + (1 | study_site:canopy_gap_ID)
Data: dataIN
AIC BIC logLik df.resid
7585.662 7597.596 -3786.831 48
Random-effects (co)variances:
Conditional model:
Groups Name Std.Dev.
study_site:canopy_gap_ID (Intercept) 12.99
Number of obs: 54 / Conditional model: study_site:canopy_gap_ID, 18
Fixed Effects:
Conditional model:
(Intercept) elevation canopy_openness ba_total elevation:canopy_openness
-1.368e+01 8.103e-03 6.163e-02 4.958e-02 4.093e-04
Warning message:
In (function (start, objective, gradient = NULL, hessian = NULL, :
NA/NaN function evaluation
是否有必要解决此警告消息?如果是的话我该怎么办?
一般来说,这个警告是不是你需要担心的事情(尽管为了清楚起见,除了
suppressWarnings()
之外,看看是否有其他方法可以消除它总是好的)。这只是意味着在模型拟合过程中的某个时刻,R 尝试了一组参数,这些参数产生了 NaN
负对数似然值。拟合算法足够强大,一个(或几个)这样的实例不会破坏它们。
您通常可以通过缩放预测变量来消除此类警告:
datasc <- datawizard::standardize(dataIN, exclude = "abund")
g2 <- update(g, data = datasc)
但是,关于这个模型/数据集有几个问题需要强调(所以也许警告是一件好事)。
80% 的丰度为零,其余的范围非常广泛(240 到 6920)。
table(dataIN$abund)
0 240 242 244 248 250 257 732 990 994 1472 6920
43 1 1 1 1 1 1 1 1 1 1 1
坦率地说,您可能无法从这些数据中获得太多信息(无论他们花费了多少努力来收集......):