基于R语言gamlss模型预测标准差与计算z值的技术疑问
GAMLSS模型中sigma参数提取与条件标准差计算问题
问题背景
使用abdom数据集拟合GAMLSS模型,代码如下:
library(gamlss) fit = gamlss(y ~ cs(x), sigma.formula = ~ cs(x), data = abdom, family = BCPE)
尝试通过两种方式计算z值:
方式1:使用predict函数
mu = predict(fit, newdata = abdom, type = "response", what = "mu") si = predict(fit, newdata = abdom, type = "response", what = "sigma") z_score1 = (abdom$y - mu) / si hist(z_score1)
方式2:使用centiles.pred函数
z_score2 = centiles.pred(fit, xname = "x", xvalues = abdom$x, yval = abdom$y, type = "z-scores") hist(z_score2)
遇到的异常:
z_score1结果大部分不在-2到2区间内- 绘制
mu±2sigma图时,sigma值过小导致两条线几乎重合
疑问:
predict得到的sigma值若不是x的条件标准差,那它代表什么?- 如何预测给定x值对应的标准差?
问题解答
1. predict返回的sigma参数含义
你选用的BCPE分布是四参数分布(包含mu、sigma、nu、tau),这里的sigma是分布的尺度参数,并非直接对应观测值的条件标准差。它需要和偏度参数nu、峰度参数tau结合,通过分布的方差公式推导才能得到实际的条件标准差。直接提取的sigma只是分布的一个基础参数,这就是为什么你计算的z值范围异常、sigma看起来过小的原因。
2. 获取给定x的条件标准差的方法
要得到x对应的条件标准差,需基于BCPE分布的方差公式计算:
BCPE分布的方差公式为:
$$\text{Var}(Y|X) = \sigma^2 \cdot \left[ \frac{\Gamma(1/\tau - 2/\nu) \cdot \Gamma(1/\tau)}{\Gamma(1/\tau - 1/\nu)^2} - 1 \right]$$
其中$\Gamma$为伽马函数。
具体实现步骤:
- 提取所有四个参数的预测值(response尺度):
# 提取mu、sigma、nu、tau的预测值 mu_pred <- predict(fit, newdata = abdom, type = "response", what = "mu") sigma_pred <- predict(fit, newdata = abdom, type = "response", what = "sigma") nu_pred <- predict(fit, newdata = abdom, type = "response", what = "nu") tau_pred <- predict(fit, newdata = abdom, type = "response", what = "tau")
- 计算条件标准差:
# 计算伽马函数项 gamma_term <- (gamma(1/tau_pred - 2/nu_pred) * gamma(1/tau_pred)) / gamma(1/tau_pred - 1/nu_pred)^2 # 计算方差 var_y <- sigma_pred^2 * (gamma_term - 1) # 得到条件标准差 sd_y <- sqrt(var_y)
- 用真实条件标准差计算正确的z值:
z_score_correct <- (abdom$y - mu_pred) / sd_y hist(z_score_correct)
此时得到的z值会符合预期的-2到2区间,绘制mu±2*sd_y的图也会显示合理的区间范围。
另外,centiles.pred返回的z-scores已经自动考虑了BCPE分布的所有参数,其结果和上述计算的z_score_correct是一致的。
内容的提问来源于stack exchange,提问作者ehi
相关产品推荐
相关产品推荐

