从gamlss centile曲线获取百分位数值

时间:2014-12-16 14:55:55

标签: r curve-fitting percentile gamlss

此问题与:Selecting Percentile curves using gamlss::lms in R

有关

我可以通过以下数据和代码获得百分位曲线:

age = sample(5:15, 500, replace=T) 
yvar = rnorm(500, age, 20)
mydata = data.frame(age, yvar)
head(mydata)
  age      yvar
1  12  13.12974
2  14 -18.97290
3  10  42.11045
4  12  27.89088
5  11  48.03861
6   5  24.68591

h = lms(yvar, age , data=mydata, n.cyc=30)
centiles(h,xvar=mydata$age, cent=c(90), points=FALSE)

enter image description here

我现在如何在曲线上获得每个x值(5:15)的yvar,这将代表平滑后数据的第90个百分点?

我尝试阅读帮助页面并找到拟合(h)和fv(h)以获得整个数据的拟合值。但是如何在第90百分位曲线水平上获得每个年龄段的值?谢谢你的帮助。

编辑:下图显示我需要的内容:

enter image description here

我尝试过关注,但它是正确的,因为值不正确:

mydata$fitted = fitted(h)
aggregate(fitted~age, mydata, function(x) quantile(x,.9))
   age    fitted
1    5  6.459680
2    6  6.280579
3    7  6.290599
4    8  6.556999
5    9  7.048602
6   10  7.817276
7   11  8.931219
8   12 10.388048
9   13 12.138104
10  14 14.106250
11  15 16.125688

这些值与直接来自数据的第90个分位数非常不同:

> aggregate(yvar~age, mydata, function(x) quantile(x,.9))
   age     yvar
1    5 39.22938
2    6 35.69294
3    7 25.40390
4    8 26.20388
5    9 29.07670
6   10 32.43151
7   11 24.96861
8   12 37.98292
9   13 28.28686
10  14 43.33678
11  15 44.46269

1 个答案:

答案 0 :(得分:2)

看看这是否有意义。正态分布的第90个百分位,其平均值和sd为' smn'和' ssd'是qnorm(.9, smn, ssd):所以这似乎提供了(有些)明智的结果,虽然不是我建议的centiles的全部黑客:

 plot(h$xvar, qnorm(.9, fitted(h), h$sigma.fv))

(注意只有几个不同的xvars但是500点的大量过度绘图。你可能想要设置ylim以便可以欣赏整个范围。)

enter image description here

这里需要注意的是,你需要检查模型的其他部分,看看它是否真的只是普通的普通模型。在这种情况下似乎是:

> h$mu.formula
y ~ pb(x)
<environment: 0x10275cfb8>
> h$sigma.formula
~1
<environment: 0x10275cfb8>
> h$nu.formula
NULL
> h$tau.formula
NULL

因此,模型只是在~1范围内具有固定方差(xvar)的均值估计,并且没有像Box-Cox模型那样的高阶参数的复杂性。 (而且我无法解释为什么这与绘制的百分位数不同。为此你可能需要与包作者对应。)