求助:R语言血清转化率绘图中数据点超出CI问题
血清转化率绘图问题:数据点超出置信区间
我用R语言绘制血清转化率图时,出现数据点超出置信区间(CI)的情况,代码如下:
proportions <- plot_data %>% group_by(Age) %>% summarize( Prop_pfmsp119 = sum(Sero_pfmsp119 == 1, na.rm = TRUE) / n(), Prop_pfama1 = sum(Sero_pfama1== 1, na.rm = TRUE) / n(), Prop_pvama1 = sum(Sero_pvama1== 1, na.rm = TRUE) / n(), prop_pvmsp119=sum(sero_pvmsp119== 1, na.rm = TRUE)/n() ) proportions <- proportions[proportions$Prop_pfmsp119 > 0, ] proportions <- proportions[proportions$Prop_pfama1 > 0, ] proportions <- proportions[proportions$Prop_pvama1 > 0, ] proportions=proportions[proportions$prop_pvmsp119 > 0, ] # 绘图代码 p1 <- ggplot(mydata, aes(x = Age, y = p)) + geom_point(data=proportions,aes(x = Age , y = Prop_pfama1),col="red") + # geom_smooth(method="glm",se=T,color="black",method.args = list(family=binomial))+ #geom_smooth(method = "loess", se = TRUE, color = "black", linewidth = 1) + labs(x = "Age (in years)", y = "Probability of Positive") + ggtitle("PfAMA1") + geom_text(x = 45, y = 0.9, label = "λ = 0.010;95% CI:(0.006-0.014)", color = "black", size = 4) + theme_classic() + #scale_x_continuous(breaks = seq(0, 100, 20)) + ylim(0,1)+ #geom_ribbon(aes(ymin = l_p, ymax = u_p), fill = "red", linetype = "dashed") geom_line()+ geom_line(aes(y=u_p),linetype="dashed")+ geom_line(aes(y=l_p),linetype="dashed")+ theme_classic()
绘图后可见红色数据点有部分落在虚线置信区间之外。
问题原因及修正方案
数据源不匹配
绘图时,散点用的是proportions中分组计算的比例,而拟合线和置信区间用的是mydata的p、u_p、l_p,两个数据集的Age分组或数据范围可能不一致,导致点和区间不对应。修正步骤
- 统一数据源:将拟合值和置信区间列合并到
proportions数据框中,以proportions作为绘图主数据源:# 假设已将p、u_p、l_p计算好并添加到proportions中 p1 <- ggplot(proportions, aes(x = Age)) + geom_point(aes(y = Prop_pfama1), col = "red") + geom_line(aes(y = p)) + geom_line(aes(y = u_p), linetype = "dashed") + geom_line(aes(y = l_p), linetype = "dashed") + labs(x = "Age (in years)", y = "Probability of Positive") + ggtitle("PfAMA1") + geom_text(x = 45, y = 0.9, label = "λ = 0.010;95% CI:(0.006-0.014)", color = "black", size = 4) + theme_classic() + ylim(0,1) - 直接用
geom_smooth拟合并生成置信区间:这种方法无需手动计算区间,更可靠,适合比例数据的二项式拟合:p1 <- ggplot(proportions, aes(x = Age, y = Prop_pfama1)) + geom_point(col = "red") + geom_smooth(method = "glm", se = TRUE, color = "black", method.args = list(family = binomial)) + labs(x = "Age (in years)", y = "Probability of Positive") + ggtitle("PfAMA1") + geom_text(x = 45, y = 0.9, label = "λ = 0.010;95% CI:(0.006-0.014)", color = "black", size = 4) + theme_classic() + ylim(0,1) - 检查数据过滤逻辑:当前过滤了所有四个指标均大于0的Age组,若置信区间计算包含这些被删除的组,会导致区间与剩余数据点不匹配,可调整过滤条件或同步置信区间的计算范围。
- 统一数据源:将拟合值和置信区间列合并到
内容的提问来源于stack exchange,提问作者solomon Sisay
相关产品推荐
相关产品推荐

