1

与 barplot 和 dotchart (来自调查包)类似,barNest(plotrix 包)旨在动态生成 svyby 对象的图,但也绘制置信区间。然而 barNest.svymean 不再处理调查数据。另一种方法是在调查绘图函数点图顶部绘制置信区间

library(survey)
data(api)
dclus1<-svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc)
#just one variable        
a<-svyby(~api99, ~stype, dclus1, svymean)
#several variables
b<-svyby(~api99+api00, ~stype, dclus1, svymean)
dotchart(b)

虽然我不确定你会怎么做。如果有人能解决这个问题,那么自动化它会非常好(通过创建一些适用于不同大小的 svyby 对象的代码),甚至可能将其合并到 dotchart.svystat {survey} 中。这将使组之间的图形比较更容易!标准误差可以从 b 或使用 SE(b) 提取。

4

2 回答 2

2

对,所以您尝试在不知道如何处理该类的函数(barNest)中使用对象类(svyby),因为调查包和 plotrix 包不能很好地配合使用。幸运的是 svyby 对象的 dotchart 方法代码不多,所以你可能只想修改它..

    # run your code above, then review the dotchart method for svyby objects:
    getS3method( 'dotchart' , 'svyby' )

b..从中您可以了解到,在将对象中包含的数据转换为矩阵之后,除了调用原始 dotchart 函数(即不使用 svyby 对象,只是一个常规的统计数据集合)之外,它实际上并没有太多。现在你剩下要做的就是添加一条置信区间线。

置信区间宽度很容易SE(b)通过运行获得(比使用更容易)

    confint( b )

你能提取这些统计数据来构建你自己的barNestplotCI调用吗?

如果将置信区间放在点图上很重要,那么主要障碍是正确地达到 y 坐标。在dotchart默认方法中挖掘..

    getS3method( 'dotchart' , 'default' )

..你可以看到y坐标是如何计算的。减少到只是必需品,我认为你可以使用这个:

    # calculate the distinct groups within the `svyby` object
    groups <- as.numeric( as.factor( attr( b , 'row.names' ) ) )

    # calculate the distinct statistics within the `svyby` object
    nstats <- attr( b , 'svyby' )$nstats

    # calculate the total number of confidence intervals you need to add
    n <- length( groups ) * nstats

    # calculate the offset sizes
    offset <- cumsum(c(0, diff(groups) != 0))

    # find the exact y coordinates for each dot in the dotchart
    # and leave two spaces between each group
    y <- 1L:n + sort( rep( 2 * offset , nstats ) )

    # find the confidence interval positions
    ci.pos <- 
        rep( groups , each = nstats ) + 
        c( 0 , length( groups ) )

    # extract the confidence intervals
    x <- confint( b )[ ci.pos , ]

    # add the y coordinates to a new line data object
    ld <- data.frame( x )

    # loop through each dot in the dotchart..
    for ( i in seq_len( nrow( ld ) ) ){

        # add the CI lines to the current plot
        lines( ld[ i , 1:2 ] , rep( y[i] , 2 ) )

    }

但这显然很笨拙,因为允许置信区间远离屏幕。暂时忽略svyby类甚至整个survey包,找到我们dotchart很好地实现了该格式的置信区间,我们也许可以为您提供更多帮助。我不认为survey包裹是你问题的根源:)

于 2012-12-29T20:01:35.947 回答
0

在 Anthony 的最后一位(来自 ld<-data.frame(x))中添加一个新的点图(带有最小值和最大值)可以解决他概述的问题。

ld <- data.frame( x )
dotchart(b,xlim=c(min(ld),max(ld)))#<-added
for ( i in seq_len( nrow( ld ) ) ){  
  lines( ld[ i , 1:2 ] , rep( y[i] , 2 ) )
}

但是我同意安东尼的观点:情节看起来不太好。非常感谢 Anthony 分享他的知识和编程技巧。置信区间看起来也不对称(这可能是正确的),尤其是对于 M api00。有人把这个和其他软件比较过吗?confit 是否应该指定一个 df(自由度)?

于 2012-12-30T08:31:14.453 回答