首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ggplot2可视化连续预测因子对二分法结果的影响

使用ggplot2可视化连续预测因子对二分法结果的影响
EN

Stack Overflow用户
提问于 2021-11-24 10:15:45
回答 2查看 68关注 0票数 0

我的数据集有两列。第一列:一个二分变量--“是”或“否”。第2列:连续预测,范围为3- 6。

在基数R中,通过简单地使用plot(outcome~predictor),我可以很容易地可视化这个连续预测因子对实现上述二分法结果的概率的影响。如果我这样做,我会得到一个类似于下面这样的图:

我无法使用ggplot2复制这种类型的图,也找不到任何其他人使用我认为的简单方法来可视化数据的示例。如果有人能够解释我如何使用ggplot2生成这个图,我将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2021-11-24 10:36:40

您可以使用geom_rect实现此目的,如下所示:

首先,一些玩具数据:

代码语言:javascript
复制
x <- runif(1000)
y <- rbinom(1000,1,0.2)
df <- data.frame(x,y)

现在创建一个包含每个矩形坐标的新数据帧。你需要定义如何分解轴,你可以均匀地做,使用分位数,无论什么..我选择了一些任意值:

代码语言:javascript
复制
limits <- c(0,.3,.9,1)

现在我可以找到我想要的每个组的比例:

代码语言:javascript
复制
df$xcut <- cut(x, c(0,.3,.9,1))
df2 <- aggregate(data=df, y~xcut, mean)
df2$max <- limits[-1]
df2$min <- limits[-(length(limits))]
df2

       xcut         y max min
1   (0,0.3] 0.2052980 0.3 0.0
2 (0.3,0.9] 0.2128378 0.9 0.3
3   (0.9,1] 0.2358491 1.0 0.9

现在,您已经拥有了geom_rect所需的一切

代码语言:javascript
复制
ggplot(df2) + geom_rect(aes(xmin=min,xmax=max, ymin=0, ymax=y ), fill="white", col="black") + 
  labs(y="Proportion",x="x") + 
  scale_x_continuous(breaks=limits)

你可以调整y轴的比例并添加“no”框来获得你想要的效果,尽管这看起来有点多余。

票数 1
EN

Stack Overflow用户

发布于 2021-11-24 11:04:37

这是一个基于R和ggplot的解决方案。首先,我们创建一些数据

代码语言:javascript
复制
set.seed(1)
df <- data.frame(Predictor= round(rnorm(10000, 5, 2), 0),
             Dichotomous_outcome= factor(sample(c("Yes", "No"), 10000, replace= TRUE)))

然后,我们将预测的二进制变量表出来,并计算分数

代码语言:javascript
复制
df_table <- aggregate(Dichotomous_outcome ~ Predictor, df, table)

df_table$Yes_fraction <- df_table$Dichotomous_outcome[, "Yes"]/ rowSums(df_table$Dichotomous_outcome)
df_table$No_fraction <- df_table$Dichotomous_outcome[, "No"]/ rowSums(df_table$Dichotomous_outcome)
df_table <- df_table[order(df_table$Predictor), ]

现在我们转换数据帧,这样我们就可以生成一个矩形

代码语言:javascript
复制
df_rect <- data.frame(x_min= rep(df_table$Predictor[1:(nrow(df_table)-1)], 2),
                      x_max= rep(df_table$Predictor[2:(nrow(df_table))], 2),
                      y_min= c(rep(0, nrow(df_table)-1), df_table$Yes_fraction[-1]),
                      y_max= c(df_table$Yes_fraction[-1], rep(1, nrow(df_table)-1)),
                      col= rep(c("Yes", "No"), each= nrow(df_table)-1))

现在我们可以绘制它了

代码语言:javascript
复制
library(ggplot2)
ggplot(df_rect) +
  geom_rect(aes(xmin= x_min, xmax= x_max, ymin= y_min, ymax= y_max, fill= col), col= "black") +
labs(x= "Predictor", y= "Dichotomuous Outcome") +
  scale_y_continuous(breaks= c(.25, .75), labels= c("Yes", "No"))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70094262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档