首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将Y值的比数比置于X对at图(或其他R图)的均值之上或以下的标准差处

如何将Y值的比数比置于X对at图(或其他R图)的均值之上或以下的标准差处
EN

Stack Overflow用户
提问于 2021-03-03 23:23:41
回答 2查看 117关注 0票数 0

我有这样的数据。

代码语言:javascript
运行
复制
Probability <- c(1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0)
Score2 <- c(2,3,4,2,3,4,2,3,4,4,3,2,3,2,3,2,3,2,3,4,2,3,4,2,3,3,4,3,2,3,2,3,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值)。

下面给我所有的东西,除了+/- 1SD和它的p-值的赔率比。

代码语言:javascript
运行
复制
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))

问题

我如何添加优势比(比较概率在1 SD以上和以下的平均值X)?

EN

回答 2

Stack Overflow用户

发布于 2021-03-04 00:57:07

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

代码语言:javascript
运行
复制
library(ggpubr)

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

线性概率模型

代码语言:javascript
运行
复制
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]))

Logistic回归

代码语言:javascript
运行
复制
glm_prob <- glm(Probability ~ Score2,data=Data2,family=binomial())

glm_pred_probs = predict(glm_prob,newdata = data.frame(Score2 = c(mean_x - sd_x, 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更新,不会改变结果.

代码语言:javascript
运行
复制
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),2),
               ", ",
               round(exp(glm_contrast$Upper),2),
               ", p = ",
               round(glm_contrast$Pvalue,3)
               )

绘图

代码语言:javascript
运行
复制
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))
票数 1
EN

Stack Overflow用户

发布于 2021-03-04 19:02:11

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

图书馆(Ggpubr)

代码语言:javascript
运行
复制
### @jVargh7's code ###    
library(ggplot2)  
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,newdata = data.frame(Score2 = c(mean_x - sd_x, 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]))

install.packages("contrast")
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),2),
               ", ",
               round(exp(glm_contrast$Upper),2),
               ", 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 = 2.75, label.y= .6, 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))+ 
### 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)

下面的示例输出

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

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

https://stackoverflow.com/questions/66466426

复制
相关文章

相似问题

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