如何在R中创建比值比和95%CI图

时间:2012-11-14 19:47:05

标签: r plot

我估计了比值比,其中6种污染物的相应95%CI超过4个滞后期。如何创建一个类似于R中附图的垂直图?下图是在SPSS中创建的。 产生该数字的样本数据如下:

lag pollut  or  lcl ucl
0   CO  0.97    0.90    1.06
0   PM10    1.00    0.91    1.09
0   NO  0.97    0.92    1.02
0   NO2 1.01    0.89    1.15
0   SO2 0.97    0.85    1.11
0   Ozone   1.00    0.87    1.15
1   CO  1.03    0.95    1.10
1   PM10    0.93    0.86    1.01
1   NO  1.01    0.97    1.06
1   NO2 1.08    0.97    1.20
1   SO2 0.94    0.84    1.04
1   Ozone   0.94    0.84    1.04
2   CO  1.09    1.02    1.16
2   PM10    1.04    0.96    1.13
2   NO  1.04    1.00    1.08
2   NO2 1.07    0.96    1.18
2   SO2 1.05    0.95    1.17
2   Ozone   0.93    0.84    1.03
3   CO  0.98    0.91    1.06
3   PM10    1.14    1.05    1.24
3   NO  0.99    0.95    1.04
3   NO2 1.01    0.91    1.12
3   SO2 1.11    1.00    1.23
3   Ozone   1.00    0.90    1.11

Odds ratio and 95 % CI plot created in SPSS

2 个答案:

答案 0 :(得分:9)

您也可以使用ggplot2执行此操作。代码有点短:

 dat <- read.table("clipboard", header = T)
 dat$lag <- paste0("L", dat$lag)

 library(ggplot2)

 ggplot(dat, aes(x = pollut, y = or, ymin = lcl, ymax = ucl)) + geom_pointrange(aes(col = factor(lag)), position=position_dodge(width=0.30)) + 
 ylab("Odds ratio & 95% CI") + geom_hline(aes(yintercept = 1)) + scale_color_discrete(name = "Lag") + xlab("")

enter image description here

编辑:这是一个更贴近SPSS数据的版本:

ggplot(dat, aes(x = pollut, y = or, ymin = lcl, ymax = ucl)) + geom_linerange(aes(col = factor(lag)), position=position_dodge(width=0.30)) +
geom_point(aes(shape = factor(lag)), position=position_dodge(width=0.30)) + ylab("Odds ratio & 95% CI") + geom_hline(aes(yintercept = 1)) + xlab("")

答案 1 :(得分:3)

假设您的数据位于datf ...

我首先要按照你想要的顺序排序。

datf <- datf[order(datf$pollut, datf$lag), ]

你想要在每个实验室分组之前和之后留出一个空格,所以我要添加一些NA的额外行。这样会更容易,因为那样你的情节调用就会自动出现空白。

datfPlusNA <- lapply(split(datf, datf$pollut), function(x) rbind(NA, x, NA))
datf <- do.call(rbind, datfPlusNA)

现在您已经对data.frame进行了排序,并且使用了额外的NA,因此绘图非常简单。

nr <- nrow(datf)  # find out how many rows all together
with(datf, {# this allows entering your commands more succinctly
    # first you could set up the plot so you can select the order of drawing
    plot(1:nr, or, ylim = c(0.8, 1.3), type = 'n', xaxt = 'n', xlab = '', ylab = 'Odds Ratio and 95% CI', frame.plot = TRUE, panel.first = grid(nx = NA, ny = NULL))
    # arrows(1:nr, lcl, 1:nr, ucl, length = 0.02, angle = 90, code = 3, col = factor(lag)) 
    # you could use arrows above but you don't want ends so segments is easier
    segments(1:nr, lcl, 1:nr, ucl, col = factor(lag))
    # add your points
    points(1:nr, or, pch = 19, cex = 0.6)
    xLabels <- na.omit(unique(pollut))
    axis(1, seq(4, 34, by = 6) - 0.5, xLabels)
})
abline(h = 1.0)

有些软件包可以让这种事情变得更容易,但如果你能这样做,你可以开始做任何你能想象的图表。

enter image description here