【问题标题】:R Plotting confidence bands with ggplotR用ggplot绘制置信带
【发布时间】:2012-12-11 14:18:38
【问题描述】:

我想为装有 gls 的模型创建一个置信带,如下所示:

require(ggplot2)
require(nlme)

mp <-data.frame(year=c(1990:2010))

mp$wav <- rnorm(nrow(mp))*cos(2*pi*mp$year)+2*sin(rnorm(nrow(mp)*pi*mp$wav))+5
mp$wow <- rnorm(nrow(mp))*mp$wav+rnorm(nrow(mp))*mp$wav^3

m01 <- gls(wow~poly(wav,3), data=mp, correlation = corARMA(p=1))

mp$fit <- as.numeric(fitted(m01))

p <- ggplot(mp, aes(year, wow))+ geom_point()+ geom_line(aes(year,fit))
p

这只会绘制拟合值和数据,我想要一些风格的东西

p <- ggplot(mp, aes(year, wow))+ geom_point()+ geom_smooth()
p

但使用 gls 模型生成的波段。

谢谢!

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:
    require(ggplot2)
    require(nlme)
    
    set.seed(101)
    mp <-data.frame(year=1990:2010)
    N <- nrow(mp)
    
    mp <- within(mp,
             {
                 wav <- rnorm(N)*cos(2*pi*year)+rnorm(N)*sin(2*pi*year)+5
                 wow <- rnorm(N)*wav+rnorm(N)*wav^3
             })
    
    m01 <- gls(wow~poly(wav,3), data=mp, correlation = corARMA(p=1))
    

    获取拟合值(同m01$fitted

    fit <- predict(m01)
    

    通常我们可以使用 predict(...,se.fit=TRUE) 之类的东西来获取预测的置信区间,但 gls 不提供此功能。我们使用类似于http://glmm.wikidot.com/faq 所示的配方:

    V <- vcov(m01)
    X <- model.matrix(~poly(wav,3),data=mp)
    se.fit <- sqrt(diag(X %*% V %*% t(X)))
    

    拼凑一个“预测框架”:

    predframe <- with(mp,data.frame(year,wav,
                                    wow=fit,lwr=fit-1.96*se.fit,upr=fit+1.96*se.fit))
    

    现在使用geom_ribbon 绘图

    (p1 <- ggplot(mp, aes(year, wow))+
        geom_point()+
        geom_line(data=predframe)+
        geom_ribbon(data=predframe,aes(ymin=lwr,ymax=upr),alpha=0.3))
    

    如果我们针对wav 而不是year 进行绘图,则更容易看出我们得到了正确的答案:

    (p2 <- ggplot(mp, aes(wav, wow))+
        geom_point()+
        geom_line(data=predframe)+
        geom_ribbon(data=predframe,aes(ymin=lwr,ymax=upr),alpha=0.3))
    

    以更高的分辨率进行预测会很好,但是使用poly() 拟合的结果来执行此操作有点棘手——请参阅?makepredictcall

    【讨论】:

    • 如何使最后一个图的多项式变得平滑并且实际上看起来像多项式?
    • 正如我所说,这会很棘手。您必须确保以使用原始模型的基础的方式构建模型矩阵 - 请参阅?makepredictcall
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多