如何在ggplot2中为逻辑回归结果重新创建此直方图和曲线组合图?

时间:2016-10-24 15:53:20

标签: r plot ggplot2 logistic-regression

我希望可视化逻辑回归分析的结果,并且遇到了这个漂亮的情节here

hope this works http://www.shizukalab.com/toolkits/plotting-logistic-regression-in-r/logistic_1.jpg

我想在ggplot中重新创建这个情节,不知道如何处理它。具体来说,我如何将一个倒置的直方图添加到情节的“顶部”?

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

请注意,尝试使用两个不同的轴进行此操作会很混乱,这可能是一个坏主意。但是,您应该能够使用以下方法复制该绘图。

首先,一些示例数据:

df <-
  data.frame(
    x = c(rnorm(100, 30,2)
          , rnorm(100, 28, 2))
    , response = factor(rep(c("Y","N"), each = 100))
  )

为了看看我们正在使用什么,这里是更传统的情节类型:

df %>%
  ggplot(aes(x = x, y = as.numeric(response) - 1)) +
  geom_jitter(height = 0.2) +
  stat_smooth(method="glm", family="binomial") +
  ylab("Probability")

enter image description here

然后,我们需要构建我们将用于绘制的箱子。我正在我希望中断的位置切割数据(这里,使用pretty自动化),转换为一小部分数据,然后生成x / y范围以用于制作矩形以模拟直方图。 / p>

binned <-
  df %>%
  mutate(bin = cut(x, pretty(x))) %$%
  table(bin, response) %>%
  prop.table() %>%
  as.data.frame() %>%
  separate(bin, c("xmin","xmax"), ",") %>%
  mutate_each(funs(parse_number(.)), xmin, xmax) %>%
  mutate(ymin = ifelse(response == "N"
                       , 0
                       , 1 - Freq)
         , ymax = ifelse(response == "Y"
                         , 1
                         , Freq))

然后,将每种数据类型传递给不同的geom_*,您应该得到您想要的情节:

ggplot() +
  geom_rect(
    aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax)
    , data = binned
  ) +
  stat_smooth(
    mapping = aes(x = x, y = as.numeric(response) - 1)
    , data = df
    , method="glm", family="binomial") +
  ylab("Probability/Portion of data in category")

enter image description here

然后,您需要使用轴/标签来满足您的需求。值得注意的是,如果您希望条形变大或变小(取决于您的需要),您可以通过更改yminymax的规格来包含乘数(例如更改Freq)来实现这一目标。到Freq * 2)虽然这会改变对高度的解释。