R语言integrate函数报错:'upper'必须为长度1,如何解决?
报错原因与解决方案:
integrate参数长度不匹配问题 报错原因
GoFKernel::inverse执行时会向Fz传入长度大于1的向量作为z参数- 当
z是向量时,(x-z)*10会生成多组值,导致Fl函数的输入h变成向量 - R基础函数
integrate要求upper参数必须是单个数值(长度为1),因此触发'upper' must be of length one错误
解决方法
核心是让Fz支持向量输入,确保每个z值被单独处理,保证Fl的h参数始终是单个数值。有两种常用实现方式:
方式1:用Vectorize包装Fz
用R内置的Vectorize函数将Fz转换为支持向量输入的版本:
fl=function(q,a=-23.0344,b=10.0249) (b/q)*dnorm((a+b*log(q)),0,1) Fl=function(h) integrate(fl,lower=0,upper=h)$value Fz=function(z){ integrand=function(x){ Fl((x-z)*10)*fl(10*x) } 1-10*integrate(integrand,0,Inf)$value } # 对Fz进行向量化包装,使其支持向量输入 Fz_vec <- Vectorize(Fz) library(GoFKernel) inv=inverse(Fz_vec,lower=-100000,upper=100000)
方式2:在Fz内部用sapply循环处理
手动在Fz内部遍历每个z值,单独计算积分:
fl=function(q,a=-23.0344,b=10.0249) (b/q)*dnorm((a+b*log(q)),0,1) Fl=function(h) integrate(fl,lower=0,upper=h)$value Fz=function(z){ # 用sapply遍历每个z值,单独处理 sapply(z, function(z_single) { integrand=function(x){ Fl((x-z_single)*10)*fl(10*x) } 1-10*integrate(integrand,0,Inf)$value }) } library(GoFKernel) inv=inverse(Fz,lower=-100000,upper=100000)
原理说明
GoFKernel::inverse函数要求目标累积分布函数(此处为Fz)支持向量输入,通过向量化处理,每个z值会被单独传入Fl,确保integrate的upper参数始终是单个数值,满足函数参数要求。
内容的提问来源于stack exchange,提问作者o.f
相关产品推荐
相关产品推荐

