微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 Y 值的优势比置于 X 均值上下一个标准偏差处,以显示 ggplot或其他 R 图 线性概率模型逻辑回归情节

如何解决如何将 Y 值的优势比置于 X 均值上下一个标准偏差处,以显示 ggplot或其他 R 图 线性概率模型逻辑回归情节

我有这样的数据。

Probability <- c(1,1,0)
score2 <- c(2,3,4,2,3)
Data2 <- data.frame(Probability,score2)

Data
   Probability score2
1            1      2
2            1      3
3            1      4
4            1      2
5            1      3
6            1      4
7            1      2
8            1      3
9            1      4
10           0      4
11           0      3
12           0      2
13           0      3
14           0      2
15           0      3
16           0      2
17           0      3
18           1      2
19           1      3
20           1      4
21           1      2
22           1      3
23           1      4
24           1      2
25           1      3
26           1      3
27           0      4
28           0      3
29           0      2
30           0      3
31           0      2
32           0      3
33           0      2
34           0      3

我不仅需要绘制相关图,还需要添加比值比,比较 Y 在高于和低于 X 均值的 1 个标准差处的几率(以及相应的 p 值)。

除了 +/- 1 SD 的优势比及其 p 值之外,以下内容让我得到了一切。

ggplot(Data2,aes(score2,Probability))+ 
  geom_smooth(method='lm',alpha = .3,color = "black")+
  stat_cor(method = "pearson",label.x.npc = "left",label.y.npc= "top",label.sep = "
")+
  scale_colour_grey(start = .6,end = .2)+
  scale_fill_grey(start = 0.6,end = 1)+
  theme_classic()+
  scale_y_continuous(breaks = c(0,0.25,0.5,0.75,1),limits = c(0,1))

image of correlation plot without odds ratio

问题

如何添加优势比(比较 X 平均值上下 1 个标准差处的概率)?

解决方法

您也可以使用用于线性概率模型的对比包来估计 CI。

library(ggpubr)

mean_x = mean(Score2)
sd_x = sd(Score2)

线性概率模型

lm_prob <- lm(Probability ~ Score2,data=Data2)

pred_probs = predict(lm_prob,newdata = data.frame(Score2 = c(mean_x - sd_x,mean_x+sd_x)))
or_pred = (pred_probs[2]/(1-pred_probs[2]))/(pred_probs[1]/(1-pred_probs[1]))

逻辑回归

glm_prob <- glm(Probability ~ Score2,data=Data2,family=binomial())

glm_pred_probs = predict(glm_prob,mean_x+sd_x)),type = "response",se.fit = TRUE)
glm_or_pred = (glm_pred_probs$fit[2]/(1-glm_pred_probs$fit[2]))/(glm_pred_probs$fit[1]/(1-glm_pred_probs$fit[1]))

对比语句可以用 mean_x + sd_x 和 mean_x - sd_x 更新。它不会改变结果。

library(contrast)
glm_contrast <- 
  contrast(glm_prob,list(Score2 = sd_x),list(Score2 = -sd_x)
  )
print(glm_contrast,X = TRUE)

or_ci = paste0(round(exp(glm_contrast$Contrast),2),",95% CI:",round(exp(glm_contrast$Lower),round(exp(glm_contrast$Upper),p = ",round(glm_contrast$Pvalue,3)
               )

情节

ggplot(Data2,aes(Score2,Probability))+ 
  geom_smooth(method='lm',alpha = .3,color = "black")+
  stat_cor(method = "pearson",label.x.npc = "left",label.y.npc= "top",label.sep = "
")+
  annotate("text",x=3.0,y=0.9,label= paste0("OR = ",or_ci)) +
  scale_colour_grey(start = .6,end = .2)+
  scale_fill_grey(start = 0.6,end = 1)+
  theme_classic()+
  scale_y_continuous(breaks = c(0,0.25,0.5,0.75,1),limits = c(0,1))
,

@jvargh7 帮我解决了大部分问题(减去标准偏差括号)here

图书馆(ggpubr)

### @jVargh7's code ###    
library(ggplot2)  
library(ggpubr)
  
mean_x = mean(Score2)
sd_x = sd(Score2)

lm_prob <- lm(Probability ~ Score2,mean_x+sd_x)))
or_pred = (pred_probs[2]/(1-pred_probs[2]))/(pred_probs[1]/(1-pred_probs[1]))

glm_prob <- glm(Probability ~ Score2,se.fit = TRUE)
glm_or_pred = (glm_pred_probs$fit[2]/(1-glm_pred_probs$fit[2]))/(glm_pred_probs$fit[1]/(1-glm_pred_probs$fit[1]))

install.packages("contrast")
library(contrast)
glm_contrast <- contrast(glm_prob,list(Score2 = -sd_x))
print(glm_contrast,95% CI: ",3)
)   

ggplot(Data2,label.x = 2.75,label.y= .6,label.sep = ",")+
  scale_colour_grey(start = .6,1))+ 
### new code ###
  geom_bracket(xmin = mean(Score2)-sd(Score2),xmax = mean(Score2)+sd(Score2),y.position = .9,label = paste0("OR = ",or_ci),tip.length = c(0.42,0.29),vjust = -1)

下面的示例输出

image of linear regression plot with odds ratio of Y at 1 S.D. above and below the mean of X

再次感谢 @jvargh7 为我提供了大部分解决方案 here 的机会。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。