R中fitdistr拟合负二项分布报非有限差分错误的解决方法
问题原因
两个报错的核心触发逻辑:
- 你调用的负二项分布是离散计数分布,R中对应的密度函数
dnbinom()仅支持非负整数输入,传入你提供的带小数的连续值时会直接返回NaN,似然函数根本无法计算,直接触发function cannot be evaluated at initial parameters报错。 - 手动指定
SANN/Nelder-Mead优化方法时,会覆盖fitdistr为负二项分布预设的参数空间转换逻辑,优化过程中如果走到非法参数区域(比如离散参数size为负),会得到非有限的梯度值,触发non-finite finite-difference value报错。
修复方案
首先根据数据实际属性选择处理方式:
- 如果你的数据本身是连续型、仅存在大量零值,不要使用负二项分布,应该选择零膨胀伽马、Tweedie分布这类适配连续含零数据的分布模型。
- 如果你的数据本质是计数数据,当前的小数值是预处理/计算过程中产生的估计值,可以先将数据转换为非负整数,再使用
fitdistr为负二项分布预设的默认优化逻辑(无需手动指定method参数,默认配置已经针对负二项分布做了参数空间约束,稳定性远高于手动指定通用优化器)。
可直接运行的修正代码如下:
library(MASS) test <- c(12.0267113881516,0,3.80379771067847,7.05725491534987,1.62599447730595,8.30878868218926,6.09407800158777,6.0944087874194,1.24210950760511,4.48520498182001,7.25510549345545,1.99853195575834,5.86661457976411,8.32325356444931,6.48394298573265,6.90725677738384,9.2849750875507,4.84723567802178,1.70706120564479,2.41528453337787,5.66663622929956,1.14049051919231,1.20415579381222,4.73028620968109,4.62094824590891,9.99322335474613,7.28555660260907,5.20498129498037,3.29357561350145,5.21546196710692,0,5.27443389563682,0,0,0,1.52534250716659,0,1.14049051919231,1.26613919229593,0,0,0,1.71706472345776,0,3.58594158649788,1.24611128038666,1.1921940752291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5.3067883458523,3.27131542792302,0,0,2.87101691095707,0,0,0,4.623403877228,0,7.64288059466011,3.92270670542074,2.89377318451868,1.61362654846051,3.30051043721702,0,0,0,0,2.97870996101758,3.87522664704839,1.89909233457104,1.53967232648203,0,12.810006098797,6.87392867858633,1.03574601452557,0,2.18282609051313,11.5312610850693,3.05931137579068,4.1891969565737,6.38862518509007,7.16100053058515,1.52125125858248,6.92516228711371,0,7.75079521410472,4.18476202445648,4.95389780040816,1.04362101432561,5.63455480524832,5.70627520767702,1.01215044368955,9.54222086996302,4.11372615789153,7.85690670281307,0,3.37748286391673,4.34555570781537,4.4577587209379,4.17700827446864,0,2.65463943682732,3.76691803817074,7.76854139503314,1.25612126507028,4.03718613649813,6.53721325487247,3.3860657709757,6.98199462654774,2.61132216481394,3.92396827845501,6.21167776768704,7.14618552521957,4.26831915431375,2.92035777838643,4.29696667800272,7.95684979254918,6.93960648973022,4.88371247587174,5.45540809456259,9.00170760208552,7.10268391665812,4.06498047279548,3.90863722907481,1.84231964976201,6.31650377737209,4.88794131684486,3.57808284954737,4.43455227364459,4.93466754445512,1.0239427169815,3.20804086179141,9.42760542019615,10.0405498853745,2.97745439201775,7.79249606103591,7.23887801626788,7.15339190469555,1.91459640489343,5.08221740008803,15.8154349754837,1.5829472474698,3.83447372539102,0,1.21927980113296,4.95633469976262,1.13850614307505,5.82506904570296,3.41306335807436,0,1.41534148492906,0,3.91594385295598,3.09632981688278,0,0,0,0,0,0) # 将数据转换为非负整数 test_int <- round(pmax(test, 0)) # 使用默认优化设置拟合,无需手动指定method est <- fitdistr(test_int, "negative binomial")$estimate
运行后可正常得到参数估计结果:离散参数size = 1.4278,均值mu = 3.7098。
如果你确实需要手动指定优化方法,必须同时传入合法的初始参数,比如设置
start = list(size = 1, mu = mean(test_int)),避免优化器从非法参数点启动计算。
内容的提问来源于stack exchange,提问作者user8435999
相关产品推荐
相关产品推荐

