R语言广义帕累托分布GPD参数估计函数运行报错排查
GPD参数估计R代码报错排查
报错原因
你遇到的missing value where TRUE/FALSE needed报错,确实由b向量中的NA值触发,NA产生的核心原因有两处:
- 第一处是代码笔误:在
b向量初始化的代码行中,出现了n[n]的错误写法。n是存储样本量的标量(本次场景下值为100),尝试访问长度为1的标量的第100个元素,天然返回NA,导致整个b向量初始值全部为NA。后续传入lx函数后,if (b==0)的判断条件为NA,直接触发报错。 - 第二处是参数匹配错误:你模拟生成GPD样本时使用的参数为形状参数1、尺度参数-1,该参数化下GPD的有效取值范围为
x ≤ 0,但你提供的模拟样本全部为正值,后续计算log(1-b*x)时会出现输入超出定义域的问题,也会生成NA值。
修复方案
- 修正初始化笔误:将
b初始化行中的n[n]替换为max(x),修正后的初始化代码为:
b <- w <- L <- (n-1)/(n+1)/max(x)-(1-((1:m-.5)/m)^k)/k/median(a)/2
- 调整模拟参数或样本:将模拟GPD的尺度参数改为正值,或调整样本符号匹配参数定义,保证样本取值落在GPD的有效支撑集范围内。
- 可选稳定性优化:为
lx函数增加NA校验,避免边缘场景下的判断报错,优化后的lx函数如下:
lx <- function(b,x) { if (is.na(b) || any(1-b*x <= 0)) return(-Inf) k <- -mean(log(1-b*x)) if (b==0) { k-1-log(mean(x)) } else { k-1+log(b/k) } }
内容的提问来源于stack exchange,提问作者Barbab
相关产品推荐
相关产品推荐

