mgcv包bam模型concurvity检测报错:奇异矩阵问题排查
mgcv::bam模型共曲率检测时奇异矩阵报错问题
问题描述
我用mgcv包构建的bam模型已经收敛,但调用concurvity()函数检测共曲率时,反复触发以下奇异矩阵报错:
Error in forwardsolve(t(Rt), t(R[1:r, , drop = FALSE])) : singular matrix in 'backsolve'. First zero in diagonal [14]
我的数据集是1500行×23列,取子集数据无法复现该错误。尝试过参考相关问题解决方案,以及调整concurvity()的full参数为TRUE/FALSE,均无效。只有移除随机效应项s(Season, fCYR, bs = "re")后报错消失,但这个效应是准确体现调查设计的重要部分(用于捕捉年内季节内观测的相似性),我不清楚报错原因,也不确定该如何处理。
模型代码及拟合输出
模型定义代码
library(mgcv) mod <- bam(num ~ # Parametric terms CYR.std * Season + # Habitat covariates sed_depth * ave_hw + total_ave_ma + s(ave_tt) + # Structural components s(Site, bs = "re") + s(Site, fCYR, bs = "re") + s(Site, CYR.std, bs = "re") + s(Season, fCYR, bs = "re") + offset(log(area_sampled)), data = toad, method = 'fREML', discrete = TRUE, family = poisson, control = list(trace = TRUE))
模型拟合过程输出
Setup complete. Calling fit Deviance = 226.280118812246 Iterations - 1 Deviance = 502.577417444367 Iterations - 2 Deviance = 576.624536857 Iterations - 3 Deviance = 685.39118817115 Iterations - 4 Deviance = 714.899394181739 Iterations - 5 Deviance = 735.575311982761 Iterations - 6 Deviance = 734.653307725508 Iterations - 7 Deviance = 735.874682895636 Iterations - 8 Deviance = 736.673618482559 Iterations - 9 Deviance = 736.861294501416 Iterations - 10 Deviance = 736.981664035411 Iterations - 11 Deviance = 737.00995853621 Iterations - 12 Deviance = 737.028133131768 Iterations - 13 Deviance = 737.032400712599 Iterations - 14 Deviance = 737.035137664603 Iterations - 15 Deviance = 737.035779699487 Iterations - 16 Deviance = 737.03619105456 Iterations - 17 Deviance = 737.036287496242 Iterations - 18 Deviance = 737.036349254884 Iterations - 19 Fit complete. Finishing gam object. user.self sys.self elapsed initial 0.02 0.00 0.01 gam.setup 0.03 0.00 0.03 pre-fit 0.00 0.00 0.00 fit 7.03 0.34 7.39 finalise 0.00 0.00 0.00
共曲率检测报错
执行以下代码:
concurvity(mod)
触发报错:
Error in forwardsolve(t(Rt), t(R[1:r, , drop = FALSE])) : singular matrix in 'backsolve'. First zero in diagonal [14]
更新内容
移除随机效应s(Season, fCYR, bs = "re")后问题解决,但我不理解原因。如果这个效应是准确体现调查设计的重要部分,我该如何处理?这是否属于Cross Validated的问题范畴?
模型方差成分估计
> gratia::variance_comp(mod) # # A tibble: 5 × 5 component variance std_dev lower_ci upper_ci <chr> <dbl> <dbl> <dbl> <dbl> 1 s(ave_tt) 0.000266 0.0163 0.00471 0.0564 2 s(fSite) 0.0817 0.286 0.0658 1.24 3 s(fCYR,fSite) 0.839 0.916 0.786 1.07 4 s(CYR.std,fSite) 0.00433 0.0658 0.0427 0.101 5 s(fSeason,fCYR) 0.667 0.816 0.565 1.18
单条示例数据
> x <- toad[sample(nrow(toad), 1), ] > dput(x) structure(list(CYR = 2010L, Season = structure(2L, levels = c("DRY", "WET"), class = "factor"), Site = structure(34L, levels = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47"), class = "factor"), area_sampled = 3L, Latitude = 25.48503, Longitude = -80.33982, num = 0L, den = 0, occur = 0L, temp = 32.3, DO = 2.7, sal = 28.78, group = "polyhaline", water_depth = 85L, sed_depth = 54, ave_sav = 36, ave_tt = 0, ave_hw = 22.5, ave_sf = 0, ave_rm = 0, total_ave_ma = 0.1, fCYR = structure(4L, levels = c("2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022"), class = "factor"), CYR.std = 3L), row.names = 130183L, class = "data.frame")
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

