R中Weibull分布CDF计算结果不一致及pweibull用法疑问
问题
我需要计算威布尔随机变量X($X \sim \text{Weibull}(\lambda, g)$)大于1000的概率,手动通过CDF公式计算:
g = log(log(.7)/log(.5))/log(40/81) lambda = -log(.7)/400^g > exp(-lambda*1000^g) [1] 0.4294352
但使用R的pweibull函数计算时得到的结果是0:
> pweibull(1000, shape = g, scale= lambda, lower.tail = FALSE) [1] 0
为什么两者结果不同?是我错误使用了R的函数吗?
解答
问题出在威布尔分布的参数化定义差异上:
- 你手动计算用的生存函数形式是:$P(X > x) = \exp(-\lambda x^g)$,这里的$\lambda$是速率类参数,和R中
pweibull的scale参数不是同一个概念。 - R的
pweibull函数采用标准参数化,生存函数为:$\exp\left( -\left( \frac{x}{\text{scale}} \right)^{\text{shape}} \right)$
要让R的计算结果和手动计算一致,需要把你的$\lambda$转换为R的scale参数:
根据两种参数化的对应关系,$\lambda = \frac{1}{\text{scale}^g}$,因此$\text{scale} = \left( \frac{1}{\lambda} \right)^{\frac{1}{g}}$
代入你的参数转换后重新计算:
g = log(log(.7)/log(.5))/log(40/81) lambda = -log(.7)/400^g # 转换为R的scale参数 r_scale = (1/lambda)^(1/g) # 重新计算生存概率 pweibull(1000, shape = g, scale = r_scale, lower.tail = FALSE)
运行这段代码会得到和手动计算一致的结果(约0.429)。
你之前直接把$\lambda$传给scale参数,导致scale的值极小(约0.00127),此时$(1000 / 0.00127)^g$是一个极大的数,$\exp(-\text{极大数})$在数值计算中被近似为0,这就是你得到0结果的原因。
内容的提问来源于stack exchange,提问作者nilsinelabore
相关产品推荐
相关产品推荐

