简化了 R 中 ggplot 的长轴线和置信区间

Reduced major axis line and CI for ggplot in R

提问人:Steve 提问时间:5/24/2011 最后编辑:Steve 更新时间:12/7/2021 访问量:4848

问:

有没有办法将缩小的主轴线(理想情况下是 CI)添加到 ggplot?我知道我可以使用 method=“lm” 来获得 OLS 拟合,但似乎没有 RMA 的默认方法。我可以从包 lmodel2 中获取 RMA 系数和 CI 间隔,但使用 geom_abline() 添加它们似乎不起作用。这是虚拟数据和代码。我只想用 RMA 行和 CI 替换 OLS 行和 CI:

dat <- data.frame(a=log10(rnorm(50, 30, 10)), b=log10(rnorm(50, 20, 2)))

ggplot(dat, aes(x=a, y=b) ) + 
    geom_point(shape=1) +       
    geom_smooth(method="lm") 

编辑 1:下面的代码获取 RMA(此处称为 SMA - 标准化长轴)系数和 CI。软件包 lmodel2 提供更详细的输出,而软件包 smatr 仅返回 coefs 和 CI,如果有任何帮助:

library(lmodel2)
fit1 <- lmodel2(b ~ a, data=dat)

library(smatr)
fit2 <- line.cis(b, a, data=dat)
r ggplot2

评论

1赞 Chase 5/24/2011
请添加您正在使用的代码。lmodel2()

答:

6赞 joran 5/24/2011 #1

正如 Chase 所评论的那样,实际代码和您正在使用的代码会有所帮助。但这里有一个例子,可能会为你指明正确的方向:lmodel2()ggplot

dat <- data.frame(a=log10(rnorm(50, 30, 10)), b=log10(rnorm(50, 20, 2)))
mod <- lmodel2(a ~ b, data=dat,"interval", "interval", 99)

#EDIT: mod is a list, with components (data.frames) regression.results and 
#        confidence.intervals containing the intercepts+slopes for different 
#        estimation methods; just put the right values into geom_abline
ggplot(dat,aes(x=b,y=a)) + geom_point() + 
   geom_abline(intercept=mod$regression.results[4,2],
            slope=mod$regression.results[4,3],colour="blue") + 
   geom_abline(intercept=mod$confidence.intervals[4,2],
            slope=mod$confidence.intervals[4,4],colour="red") + 
   geom_abline(intercept=mod$confidence.intervals[4,3],
            slope=mod$confidence.intervals[4,5],colour="red") + 
   xlim(c(-10,10)) + ylim(c(-10,10))

完全披露:我对 RMA 回归一无所知,所以我只是摘取了相关的斜率和截距并将它们放入 ,使用一些示例代码作为指导。这个玩具示例中生成的 CI 似乎没有多大意义,因为我不得不使用 和 强制 ggplot 缩小,以便看到 CI 线(红色)。geom_abline()lmodel2xlim()ylim()

但也许这将帮助您在 中构建一个工作示例。ggplot()

EDIT2:添加 OP 代码以提取系数后,如下所示:ggplot()

ggplot(dat,aes(x=b,y=a)) + geom_point() + 
geom_abline(intercept=fit2[1,1],slope=fit2[2,1],colour="blue") + 
geom_abline(intercept=fit2[1,2],slope=fit2[2,2],colour="red") + 
geom_abline(intercept=fit2[1,3],slope=fit2[2,3],colour="red")

评论

0赞 Chase 5/24/2011
正是我要写的,+1。这里需要注意的是,它返回一个列表,并且是一个 data.frame,它们是该列表的一部分。从那里开始,只需指定要从该 data.frame 中提取的内容即可。lmodel2()regression.results
0赞 joran 5/24/2011
@Chase - 经过编辑以包含您的观点,谢谢。令人讨厌的是,regression.results data.frame 有一些奇怪的配号,大概是为了视觉效果。“Slope”列实际上是“Slope”。这让我短暂地绊倒了,这就是我最终使用“[”的原因。
0赞 Steve 5/24/2011
谢谢,这适用于实际线路,尽管有什么想法为什么 CI 如此奇怪吗?此外,在此软件包中,RMA=有序长轴和SMA=缩小(标准化)长轴,因此行号将为 3 而不是 4。我在编辑问题时给出的 smatr 包实际上使获取 coefs 变得更加容易。
0赞 Steve 5/24/2011
没关系 - 一旦我将行号更正为 3,CI 工作正常,非常感谢。
0赞 joran 5/24/2011
@Steve - 没有最模糊的概念;对这种类型的回归知之甚少。对于 stats.stackexchange.com 来说,这可能是一个更好的问题。
8赞 hadley 5/24/2011 #2

根据 Joran 的回答,我认为将整个数据帧传递给 :geom_abline

library(ggplot2)
library(lmodel2)

dat <- data.frame(a=log10(rnorm(50, 30, 10)), b=log10(rnorm(50, 20, 2)))
mod <- lmodel2(a ~ b, data=dat,"interval", "interval", 99)

reg <- mod$regression.results
names(reg) <- c("method", "intercept", "slope", "angle", "p-value")

ggplot(dat) + 
  geom_point(aes(b, a)) +
  geom_abline(data = reg, aes(intercept = intercept, slope = slope, colour = method))
0赞 Santi XGR 12/7/2021 #3

我发现自己处于同样的情况。

  1. 使用包获取拟合值及其置信区间:ggpmisc
    cibrary(ggpmisc)
    ci <- predict.lmodel2(fit1, method= 'RMA', interval= "confidence")

  2. 将模型预测添加到数据中:
    datci <- cbind(dat, ci)

  3. 使用透明度和线宽等参数进行绘图(当然,您可以自定义它们)geom_smooth
    p <- ggplot(datci, aes(x= b, y= a)) + geom_point() + geom_line(aes(x= b, y= a)), lwd= 1.1, alpha= 0.6)

  4. 如果要添加置信区间,请使用:geom_ribbon
    p + geom_ribbon(aes(ymin= lwr, ymax= upr, fill= feather), alpha= 0.3, color= NA)