gpt4 book ai didi

R 使用 ggplot 绘制置信带

转载 作者:行者123 更新时间:2023-12-02 17:32:30 25 4
gpt4 key购买 nike

我想为装有 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 模型生成的波段。

谢谢!

最佳答案

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))

year vs wow

如果我们根据 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))

wav vs wow

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

关于R 使用 ggplot 绘制置信带,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14033551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com