为 geom_smooth 无法处理的回归模型向 ggplot 添加回归趋势线和带阴影的标准误差区域

问题描述

我有一个 data.frame,其中包含每两组观察到的成功/失败结果以及预期概率:

library(dplyr)
observed.probability.df <- data.frame(group = c("A","B"),p = c(0.4,0.6))
expected.probability.df <- data.frame(group = c("A",p = qlogis(c(0.45,0.55)))
observed.data.df <- do.call(rbind,lapply(c("A",function(g)
  data.frame(group = g,value = c(rep(0,1000*dplyr::filter(observed.probability.df,group != g)$p),rep(1,group == g)$p)))
)) %>% dplyr::left_join(expected.probability.df)

observed.probability.df$group <- factor(observed.probability.df$group,levels = c("A","B"))
observed.data.df$group <- factor(observed.data.df$group,"B"))

我正在使用 binomial 项对这些数据进行逻辑回归(glm logitlink function offset) :

fit <- glm(value ~ group + offset(p),data = observed.data.df,family = binomial(link = 'logit'))

现在,我想使用 ggplot2geom_bar 将这些数据绘制为条形图,由 group 进行颜色编码,并添加趋势线和fit 中估计的阴影标准误差区域。

为此我会使用 stat_smooth,但我认为它无法处理公式中的 offset 项,所以看起来我需要以另一种方式组装这个数字。

获取我使用的条形图和趋势线:

slope.est <- function(x,ests) plogis(ests[1] + ests[2] * x)

library(ggplot2)
ggplot(observed.probability.df,aes(x = group,y = p,fill = group)) +
  geom_bar(stat = 'identity') +
  stat_function(fun = slope.est,args=list(ests=coef(fit)),size=2,color="black") +
  scale_x_discrete(name = NULL,labels = levels(observed.probability.df$group),breaks = sort(unique(observed.probability.df$group))) +
  theme_minimal() + theme(legend.title = element_blank()) + ylab("Fraction of cells")

enter image description here

那么问题是如何添加趋势线周围的阴影标准误差?

使用 stat_function 我可以将整个区域从标准误差的上限一直向下到 X 轴:

ggplot(observed.probability.df,color="black") +
  stat_function(fun = slope.est,args=list(ests=summary(fit)$coefficients[,1]+summary(fit)$coefficients[,2]),geom='area',fill="gray",alpha=0.25) +
  scale_x_discrete(name = NULL,breaks = sort(unique(observed.probability.df$group))) +
  theme_minimal() + theme(legend.title = element_blank()) + ylab("Fraction of cells")

enter image description here

接近但不完全在那里。

知道如何从低于标准误差下限的区域上方的阴影区域中减去吗?也许 geom_ribbon 是通往这里的路,但我不知道如何将它与 slope.est function

结合起来

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...