如何解决 R 函数 glmmTMB 警告“In (function (start, Objective,gradient = NULL, hessian = NULL, : NA/NaN functionvaluation”?

问题描述 投票:0回答:1

我正在尝试使用 R 函数

glmmTMB::glmmTMB()
将广义线性混合效应模型拟合到数据集。但是,我收到一条警告,上面写着
Warning message: In (function (start, objective, gradient = NULL, hessian = NULL,  : NA/NaN function evaluation
。我不确定这个警告是否重要或如何解决。

两个注意事项:

  1. 此警告的文本与
    glmmTMB
    故障排除小插图(位于页面底部附近的“NA/NaN 函数评估”下)中显示的文本相似但不同。我不确定这些是否是相同的警告,但文本略有不同。链接:https://cran.r-project.org/web/packages/glmmTMB/vignettes/troubleshooting.html
  2. 之前已经讨论过类似的主题,但我在调用函数
    control = 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

是否有必要解决此警告消息?如果是的话我该怎么办?

r poisson glmmtmb glmm
1个回答
0
投票

一般来说,这个警告是不是你需要担心的事情(尽管为了清楚起见,除了

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 

坦率地说,您可能无法从这些数据中获得太多信息(无论他们花费了多少努力来收集......):

  • 泊松几乎肯定是不合适的;您可能需要零通货膨胀来解释零,并且可能需要负二项式来解释高度可变的非零值
  • 在实践中,您可能无法对存在/缺席之外的任何内容进行建模,或者(缺席 vs [200-300] vs [>500])。
  • 二进制数据的经验法则是,您想要拟合的每个参数应该有大约 10 个有效样本,其中“有效样本”= min(零数,非零数) - 在这种情况下,将意味着你只能拟合 1 个参数(而不是 5 个参数加上随机效应方差......)。
© www.soinside.com 2019 - 2024. All rights reserved.