【问题标题】:LMS (Lambda-Mu-Sigma) method in RR中的LMS(Lambda-Mu-Sigma)方法
【发布时间】:2014-12-16 11:32:56
【问题描述】:

我想使用 LMS (Lambda-Mu-Sigma) 方法为我的数据创建百分位曲线。我有以下示例数据。如何使用 LMS 绘制 yvar(y 轴)与年龄(x 轴)的 10th、50th 和 90th 百分位曲线?

age = sample(5:75, 500, replace=T) 
yvar = rnorm(500, age, 20)
mydata = data.frame(age, yvar)
head(mydata)
  age     yvar
1  61 87.16011
2  58 49.73289
3  65 15.60212
4  71 83.32699
5  33 40.89592
6  18 25.04376

plot(age, yvar)

我遇到了 VGAM 包 http://www.inside-r.org/packages/cran/VGAM/docs/lms.bcn 。这是最好的方法吗?我无法真正理解它的示例代码来从上述数据创建简单的百分位曲线。感谢您的帮助。

【问题讨论】:

  • 您基本上是在要求一个迷你教程。这更符合 CrossValidated.com 所支持的内容。关于 SO 的问题应该是对实施明确战略的要求。也就是说,我之前只见过在 gamlss::lms 函数中实现的 LMS,因此使用 VGAM 方法进行编码不会有太大帮助。 (看起来不需要转换到常态。)如果您真正知道自己在做什么,然后编辑这个问题以获得代码和示例......也许使用来自帮助页面之一的数据.
  • 这里的另一个问题是任何基于 LMS/Box-Cox 的东西都需要非负响应变量。
  • @BondedDust :我试过 CrossValidated.com 但他们说这是一个 R 问题。
  • @BenBolker:我们如何将它用于非负响应变量?

标签: r curve-fitting percentile


【解决方案1】:

模拟数据(可重复):

set.seed(1001)
mydata <- data.frame(
   age = sample(5:75, 500, replace=TRUE))
mydata <- transform(mydata,
   yvar = rnorm(500, age, 20))

由于LMS 方法通常似乎基于Box-Cox transformation 的变体,这需要正值,因此更简单的方法是使用quantile regression

library("quantreg")
library("ggplot2"); theme_set(theme_bw())
g0 <- ggplot(mydata,aes(x=age,y=yvar))+geom_point()
g0 + geom_smooth(method="rq",tau=c(0.1),se=FALSE,lty=2)+
      geom_smooth(method="rq",tau=c(0.5),se=FALSE)+
      geom_smooth(method="rq",tau=c(0.9),se=FALSE,lty=2)

rq() 本身具有同时拟合所有三个百分位数的能力,但您需要使用this blog post 中建议的策略来更方便地绘制它们:

model.rq <- rq(yvar ~ age, mydata, tau=c(0.1, 0.5, 0.9))
quantile.regressions <- data.frame(t(coef(model.rq)))
colnames(quantile.regressions) <- c("intercept", "slope")
quantile.regressions$quantile <- rownames(quantile.regressions)
g0 + geom_abline(aes(intercept=intercept, slope=slope,
   colour=quantile), show_guide=TRUE, data=quantile.regressions)

或者 可以在 VGAM 中执行此操作,但我不确定这是否是您想要的/结果是否有意义。通过 lms.yjn 进行的 Yeo-Johnson 转换允许您在某些数据值为负数的情况下执行此操作,但您可以查看 ?lms.bcg?lms.bcn 以了解适用于非负数据的替代方案。

library("VGAM")
fit <- vgam(yvar ~ s(age, df = 4), lms.yjn, data=mydata,
            control=vgam.control(maxit=100),
            trace=FALSE)

我们收到一条警告消息:

## Warning message:
## In vgam.fit(x = x, y = y, w = w, mf = mf, Xm2 = Xm2, Ym2 = Ym2,  :
##  convergence not obtained in 100 iterations

可能是因为我们使用 4 节样条模型过度拟合数据?

分位数图(跟随example("lms.yjn")

par(bty = "l", mar = c(5, 4, 4, 3) + 0.1, xpd = TRUE)
qtplot(fit, percentiles = c(10, 50, 90),
        las = 1, ylab = "yvar", lwd = 2, lcol = 4)

这是一个可怕的 hack,但如果您想访问原始值以便自己绘制曲线:

pcurves <- qtplot.lmscreg(fit,show.plot=FALSE,
                          percentiles=c(10,50,90))
vals <- data.frame(age=mydata$age,pcurves$fitted.values)
vals <- vals[order(vals$age),]
matplot(vals$age,vals[,-1],type="l",lty=c(2,1,2),col=1,
        xlab="age",ylab="")

【讨论】:

  • 感谢您的回答。如增长图表所示,我需要曲线而不是直线。您还可以展示如何使用 LMS 吗?因为这最常用于构建增长曲线。我实际上只使用非负变量。
  • 再次感谢您添加 VGAM 代码。如何避免在图表上绘制点以便只有曲线可见?
猜你喜欢
  • 2021-03-14
  • 2020-05-20
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 2015-03-25
  • 2015-04-29
相关资源
最近更新 更多