4

我估计了 4 个滞后期内六种污染物对应的 95% CI 的优势比。如何创建类似于 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

在 SPSS 中创建的优势比和 95 % CI 图

4

2 回答 2

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("")

在此处输入图像描述

编辑:这是一个更接近 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("")
于 2012-11-14T21:39:41.050 回答
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)

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

在此处输入图像描述

于 2012-11-14T21:07:21.103 回答