使用dbinom拟合四参数逻辑回归时mle2提示参数不匹配报错
依赖包加载
library(grid) library(gridExtra) library(broom) library(BiodiversityR) library(vegan) library(MASS) library(nlme) library(bbmle)
测试数据集可通过公开共享表格获取。当前开展模型适配性对比,分别测试零模型、泊松分布广义线性模型、四参数逻辑回归的拟合效果,采用四参数逻辑回归的核心目的是识别景观尺度下森林覆盖度达到特定取值时,物种计数、物种占比这类响应变量的升降变化阈值。
原有泊松分布拟合(对应物种计数因变量)
此前已使用dpois完成四参数逻辑回归拟合,代码如下:
logip=function(p,lambda,x){ a=p[1] b=p[2] c=p[3] d=p[4] Riq1 = d+(a/(1+exp((b-(FOREST700+km))/c))) -sum(dpois(x,lambda=Riq1, log=TRUE)) } parnames(logip)=c("a","b","c","d") modTR.log=mle2(minuslog=logip, start= c(a=2,b=60,c=3,d=0.1), data=list(x=Patch_Richness))
当前二项分布场景的报错与问题定位
针对单站点物种占比的因变量,判断需使用二项分布,修改代码后运行报错:
Error in mle2(minuslog = logip, start = c(a = 1, b = 72, c = 3, d = 0.1), : some named arguments in 'start' are not arguments to the specified log-likelihood function.
核心疑问解答
1. 比例因变量使用dbinom的正确性
该场景使用二项分布是完全合理的:当因变量为「区域总物种数(试验总次数size)中,单站点实际记录到的物种数(成功次数x)」,且每次记录概率由森林覆盖度决定时,二项分布的适配性远优于直接对比例值做线性回归的方案。
2. 代码问题与修正方案
现有代码存在3处核心错误,直接导致拟合失败:
- 参数传递逻辑不匹配:自定义函数形参为
size、prob,但传入mle2的data仅包含绑定为矩阵的x,既没有拆分出总物种数、站点记录数两个独立向量,也无法匹配函数形参名,触发参数识别报错。 dbinom参数使用错误:dbinom的标准参数顺序为dbinom(x, size, prob, log=FALSE),其中x为成功次数、size为总试验数,现有代码参数顺序颠倒,且未传入成功次数,同时未指定log=TRUE,会导致对数似然计算错误甚至数值下溢。- 概率输出无约束:四参数逻辑模型的输出范围为
[d, d+a],直接作为二项分布的概率时,若输出超出[0,1]区间会导致dbinom返回NaN,拟合直接中断。
修正后可运行代码
# 定义负对数似然函数,所有依赖的数据均作为显式形参传入 logip = function(p, n_total, n_obs, forest_cov) { # 待拟合的4PL参数 a = p[1] # 概率上下限的振幅差 b = p[2] # 森林覆盖度的变化阈值(拐点) c = p[3] # 拐点附近的变化斜率 d = p[4] # 概率下限 # 4PL模型输出概率,初始值设置需保证输出范围落在[0,1]内 prob_est = d + a / (1 + exp((b - forest_cov) / c)) # 计算二项分布的负对数似然 -sum(dbinom(x = n_obs, size = n_total, prob = prob_est, log = TRUE)) } # 映射参数名,供bbmle识别 parnames(logip) = c("a", "b", "c", "d") # 模型拟合,所有输入数据按形参名匹配传入 modTR.log = mle2( minuslog = logip, # 初始值需保证d + a <= 1,避免概率越界 start = c(a = 0.8, b = 72, c = 3, d = 0.1), data = list( n_total = Regional_Richness, # 区域总物种数(对应二项分布的size) n_obs = Patch_Richness, # 单站点记录物种数(对应二项分布的x) forest_cov = FOREST500 + km # 预测变量:500m尺度森林覆盖度 ) )
拟合注意事项
- 初始值设置需保证4PL输出的概率范围落在
[0,1]区间内,避免初始拟合报错。 - 若拟合过程中出现概率越界的报错,可在计算
prob_est时增加截断处理:prob_est = pmax(0, pmin(1, prob_est)),或对参数增加硬约束。 - 避免依赖全局环境中的变量,将预测变量、响应变量均通过
data参数显式传入函数,可大幅降低参数匹配报错的概率。
内容的提问来源于stack exchange,提问作者mmr09
相关产品推荐
相关产品推荐

