显示估计值,置信区间和真实参数

时间:2015-02-17 01:08:56

标签: r graphics graph plot ggplot2

以下是我的数据类型。请不要注意数据的创建方式,也不要注意数字在任何情况下是否真实。问题只是关于图形。

set.seed(12)
TrueParameter = rep(c(10,15,18), each=8)
Estimate = rep(c(rnorm(8, 10, 1), rnorm(8, 15, 0.5), rnorm(8, 18, 2)))
LowBound95 = Estimate - abs(rnorm(24, 0, 5))
HighBound95 = Estimate + abs(rnorm(24, 0, 5))
LowBound99 = LowBound95 - abs(rnorm(24, 0, 5))
HighBound99 = HighBound95 + abs(rnorm(24, 0, 5))
dt = data.frame(TrueParameter = TrueParameter, Estimate = Estimate, LowBound95 = LowBound95, HighBound95 = HighBound95, LowBound99 = LowBound99, HighBound99 = HighBound99)

TrueParameter  Estimate LowBound95 HighBound95 LowBound99 HighBound99
1             10  8.519432  3.3932082   12.176699  1.2461752    14.43811
2             10 11.577169 10.2402453   14.040165  9.3276472    17.51385
3             10  9.043256  8.0477272    9.256680  7.5311749    10.45175
4             10  9.079995  8.4243818    9.643348  5.2551908    14.67984
5             10  8.002358  7.2733584   10.286494  0.9180895    19.92009
6             10  9.727704  7.9173804   19.829378  5.9976284    20.08653
7             10  9.684651  6.3147455   14.939102  3.7309665    23.94172
8             10  9.371745 -0.9884341   13.045005 -1.8782768    15.80229
9             15 14.946768 12.2416248   17.643017 12.2203346    18.17831
10            15 15.214007  9.8615466   21.785371  3.4912489    25.73099
11            15 14.611140 12.7488565   15.861334 11.7383049    17.08261
12            15 14.353059 11.9273521   15.924082  6.1050227    17.84498
13            15 14.610217 13.2362959   16.642950 13.1193988    22.48913
14            15 15.005976 12.6084131   19.978079  8.1226293    27.56944
15            15 14.923792 10.9332653   19.202634 10.0496430    19.56754
16            15 14.648268  9.6260119   15.633912  4.0574665    18.27229
17            18 20.377758 19.8528371   24.549384 17.1433928    27.17201
18            18 18.681025 12.9010601   22.914975  8.0840684    26.64948
19            18 19.013936 16.1232632   28.784463 14.2410212    34.69653
20            18 17.413390  9.4352614   28.159690  4.5118924    34.93323
21            18 18.447283 16.9047645   23.302884 12.4169675    24.36431
22            18 22.014403 19.7670733   27.739711 19.1207606    28.18712
23            18 20.023958 15.1386918   22.650961  9.9701769    23.93612
24            18 17.395082 16.4450922   18.646682 14.7336458    24.66812

第一列是数据的已知真实参数。第二列是此真实参数的估计值,第三列和第四列表示此估计值的95%置信区间,而第5列和第6列表示99%置信区间。

我的问题既是编程问题又是设计问题(我希望它不会使这篇文章过于偏离主题); 如何才能最好地显示这些数据?

我正在考虑让所有真实参数低于其他参数(无论它们是否恰好采用相同的值)。然后,真实参数将由垂直线表示。两个置信区间将绘制为水平线(两种颜色),估计值为黑点。然后我们可以很容易地看到置信区间的哪一部分与真实参数重叠。但我欢迎有人提出不同的设计!这里有类似的显示这种数据。不同之处在于参数在我的情况下不是常数,并且我希望能够显示多个置信区间。

enter image description here

我通常使用ggplot2,但我欢迎基于任何R函数和包的答案。实际上可能存在对这种情节非常方便的包。

1 个答案:

答案 0 :(得分:1)

我知道你要求方便的功能和/或包装,但无论如何......这里我通常在基地R中这样做。

我经常通过改变lwd来绘制多个置信区间。

例如:

plot(dt$Estimate, pch=20, ylim=range(pretty(c(dt$LowBound99, dt$HighBound99))),
     xlab='', ylab='', las=1, cex.axis=0.8, cex=1.5, xaxt='n')
segments(seq_len(nrow(dt)), dt$LowBound99, y1=dt$HighBound99, lend=1)
segments(seq_len(nrow(dt)), dt$LowBound95, y1=dt$HighBound95, lwd=4, lend=1)

我认为将lend=1用于segments非常有用,以便明确定义区间的末尾。

enter image description here

然后,您可以将真实参数值叠加为点:

points(dt$TrueParameter, pch=21, bg='white')

enter image description here

或将它们绘制为其他元素下方的水平线段:

plot(dt$Estimate, pch=20, ylim=range(pretty(c(dt$LowBound99, dt$HighBound99))),
     xlab='', ylab='', las=1, xaxt='n',
     panel.first=plot(dt$TrueParameter ~ factor(seq_len(nrow(dt))), add=TRUE,
                      xlab='', ylab='', axes=FALSE, border='gray70', medlwd=4))

segments(seq_len(nrow(dt)), dt$LowBound99, y1=dt$HighBound99, lend=1)
segments(seq_len(nrow(dt)), dt$LowBound95, y1=dt$HighBound95, lwd=4, lend=1)

enter image description here

上面,我们利用了箱形图的水平中位数指标,当xfactory为数字时,默认情况下会对其进行部署。 (由于每x只有一个真值,因此不会绘制框的其余部分。)我们可以在pointspch='-'使用pch=-0x2013L,但是在绘图坐标周围有点差。