我希望可视化逻辑回归分析的结果,并且遇到了这个漂亮的情节here:
hope this works http://www.shizukalab.com/toolkits/plotting-logistic-regression-in-r/logistic_1.jpg
我想在ggplot中重新创建这个情节,不知道如何处理它。具体来说,我如何将一个倒置的直方图添加到情节的“顶部”?
有人能指出我正确的方向吗?
答案 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")
然后,我们需要构建我们将用于绘制的箱子。我正在我希望中断的位置切割数据(这里,使用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")
然后,您需要使用轴/标签来满足您的需求。值得注意的是,如果您希望条形变大或变小(取决于您的需要),您可以通过更改ymin
和ymax
的规格来包含乘数(例如更改Freq
)来实现这一目标。到Freq * 2
)虽然这会改变对高度的解释。