简体   繁体   English

具有平滑置信区间的ggplot2误差条

[英]ggplot2 errorbar with smooth confidence interval

I saw the following graph from the coefplot Stata package the other day.coefplot我从coefplot Stata 包中看到了下图。 I am just wondering how can I draw a similar smooth confidence interval as an errorbar using ggplot?我只是想知道如何使用 ggplot 绘制与误差条类似的平滑置信区间? I have tried the geom_errorbar and don't think it is capable to do so.我已经尝试过geom_errorbar并且认为它没有能力这样做。 Any other ideas?还有其他想法吗? Thanks!谢谢!

在此处输入图片说明

If you read the stata documentation for smoothed ci plot, it's actually from David Sparks who provided the code here .如果您阅读了平滑 ci 图的 stata 文档,它实际上来自David Sparks ,他在这里提供了代码。 You just need to alter it slightly to make it side by side.你只需要稍微改变它,让它并排。

Below I modified the function from the git link, using ggplot() instead of qplot() :下面我从 git 链接修改了函数,使用ggplot()而不是qplot()

SmoothCoefficientPlot <- function(models, modelnames = "", removeintercept = FALSE){

  Alphas <- seq(1, 99, 2) / 100
  Multiplier <- qnorm(1 - Alphas / 2)
  zzTransparency <<- 1/(length(Multiplier)/4)
  CoefficientTables <- lapply(models, function(x){summary(x)$coef})
  TableRows <- unlist(lapply(CoefficientTables, nrow))

  if(modelnames[1] == ""){
    ModelNameLabels <- rep(paste("Model", 1:length(TableRows)), TableRows)
    } else {
    ModelNameLabels <- rep(modelnames, TableRows)
    }

  MatrixofModels <- cbind(do.call(rbind, CoefficientTables), ModelNameLabels)
  if(removeintercept == TRUE){
    MatrixofModels <- MatrixofModels[!rownames(MatrixofModels) == "(Intercept)", ]
    }
  MatrixofModels <- data.frame(cbind(rownames(MatrixofModels), MatrixofModels))

  MatrixofModels <- data.frame(cbind(MatrixofModels, rep(Multiplier, each = nrow(MatrixofModels))))

  colnames(MatrixofModels) <- c("IV", "Estimate", "StandardError", "TValue", "PValue", "ModelName", "Scalar")
  MatrixofModels$IV <- factor(MatrixofModels$IV)
  MatrixofModels[, -c(1, 6)] <- apply(MatrixofModels[, -c(1, 6)], 2, function(x){as.numeric(as.character(x))})
  MatrixofModels$Emphasis <- by(1 - seq(0, 0.99, length = length(Multiplier) + 1)[-1], as.character(round(Multiplier, 5)), mean)[as.character(round(MatrixofModels$Scalar, 5))]

  OutputPlot <- ggplot(data = MatrixofModels, aes(x = IV, y = Estimate,
   ymin = Estimate - Scalar * StandardError, ymax = Estimate + Scalar * StandardError,alpha = I(zzTransparency), colour = ModelName)) +
  geom_point(position=position_dodge(width=0.3))
  OutputPlot <- OutputPlot + geom_hline(yintercept = 0, lwd = I(7/12), colour = I(hsv(0/12, 7/12, 7/12)), alpha = I(5/12))
  OutputPlot <- OutputPlot + geom_linerange(aes(size = 1/Emphasis),position=position_dodge(width=0.3),show.legend=FALSE)
  OutputPlot <- OutputPlot + scale_size_continuous()
  OutputPlot <- OutputPlot + coord_flip() + theme_bw()
  return(OutputPlot)
  }

First create two simple linear models with similar coefficients and plot:首先创建两个具有相似系数和绘图的简单线性模型:

library(ggplot2)
mdls = by(mtcars,mtcars$am,function(x)lm(mpg ~ gear + drat + vs,data=x))

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM