R语言integrate()函数传参方式不同导致结果异常的问题
R语言integrate()函数位置传参出错问题解析
你遇到的问题核心是Vectorize默认行为与integrate参数传递的交互冲突,具体原因和解决方法如下:
问题重现
你的代码中,显式命名lower/upper时积分结果正确,但使用位置传参时结果错误:
dgpareto = Vectorize(function(x,a,l,k){ gamma(a+k)*(l^a)*(x^(k-1))/(gamma(a)*gamma(k)*((l+x)^(a+k))) }) pgpareto = function(q,a,l,k){ integrate(dgpareto,lower = 0,upper = q,a=a,l=l,k=k)$value } pgpareto2 = function(q,a,l,k){ integrate(dgpareto,0,q,a=a,l=l,k=k)$value } pgpareto(5,2,1,1) #[1] 0.9722222 pgpareto2(5,2,1,1) #[1] -0.3055556
问题根源
你对integrate参数顺序的认知是对的(第2、3位确实是lower和upper),但Vectorize函数的默认行为坑了你:
- 默认情况下,
Vectorize会对函数的所有参数(x、a、l、k)进行向量化处理,而不是只针对x。 - 当使用位置传参调用integrate时,这种全局向量化会导致参数匹配出现意外歧义,使得传递给dgpareto的参数并非你预期的a=2、l=1、k=1,最终计算出错误的积分结果。
- 而显式命名
lower/upper时,参数传递的歧义被消除,integrate能正确将a、l、k传递给dgpareto,得到正确结果。
解决方法
方法1:去掉Vectorize(推荐)
integrate本身不需要函数支持向量输入——它会逐个传入单个x值进行计算,原始的非向量化函数完全满足需求:
dgpareto = function(x,a,l,k){ gamma(a+k)*(l^a)*(x^(k-1))/(gamma(a)*gamma(k)*((l+x)^(a+k))) }
修改后,pgpareto和pgpareto2的结果都会正确。
方法2:指定仅对x向量化
如果你确实需要保留Vectorize的功能,明确指定只对x参数做向量化处理,避免其他参数被干扰:
dgpareto = Vectorize(function(x,a,l,k){ gamma(a+k)*(l^a)*(x^(k-1))/(gamma(a)*gamma(k)*((l+x)^(a+k))) }, vectorize.args = "x")
这样修改后,位置传参的pgpareto2也会返回正确结果。
内容的提问来源于stack exchange,提问作者Bhavya Shah
相关产品推荐
相关产品推荐

