svyby比例的置信区间

时间:2013-01-01 17:21:15

标签: r survey

是否存在创建置信区间的现有函数 来自svyby对象的比例(在我的例子中是survey包中二进制项的交叉表)。我经常比较各组的比例,并且拥有一个可以提取置信区间的函数(使用调查函数svyciprop而不是confint)非常方便。以下示例显示了我想要实现的目标。

加载数据

library(survey)
library(weights)
data(api)
apiclus1$both<-dummify(apiclus1$both)[,1]#Create dummy variable
dclus1<-svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc)

创建一个svyby对象,用于比较变量&#34;两者的比例&#34;跨越stype

b<-svyby(~both, ~stype, dclus1, svymean)
confint(b)#This works, but svyciprop is best in  other cases, especially when proportion is close to 0 or 1
svyciprop(b)#This requires that you specify each level and a design object

是否可以创建一个函数(例如byCI(b,method="likelihood")confint(b)实现相同但使用svyciprop?它基本上必须遍历{{1}的每个级别对象并创建一个置信区间。到目前为止,我的尝试都没有成功。

可能还有另外一种方法,但我喜欢使用svyby,因为它快速而直观。

2 个答案:

答案 0 :(得分:9)

svyby()有一个vartype=参数,用于指定您希望如何指定采样不确定度。使用vartype="ci"获取置信区间,例如

svyby(~I(ell>0),~stype,design=dclus1, svyciprop,vartype="ci",method="beta")

很容易检查这与手动执行每个级别相同,例如

confint(svyciprop(~I(ell>0), design=subset(dclus1,stype=="E"),method="beta"))

答案 1 :(得分:2)

有趣..这两个命令不应该给出相同的结果..第一个应该抛出错误或警告:

svyby( ~both , ~stype , dclus1 , svyciprop , method = 'likelihood' )
svyby( ~both , ~stype , dclus1 , svymean )

您可能想提醒Lumley博士注意这个问题 - 可能会稍微修改surveyby.R第80行附近的代码,以使svycipropsvyby内工作。 但我可能会忽略一些东西(他可能已在文档中的某处注明了它), 因此,在与他联系之前,请务必仔细阅读所有内容

无论如何,这是一个可以解决问题的临时解决方案

# create a svyby-like function specific for svyciprop
svyciby <- 
    function( formula , by , design , method = 'likelihood' , df = degf( design ) ){

        # steal a bunch of code from the survey package's source
        # stored in surveyby.R..
        byfactors <- model.frame( by , model.frame( design ) , na.action = na.pass )
        byfactor <- do.call( "interaction" , byfactors )
        uniquelevels <- sort( unique( byfactor ) )
        uniques <- match( uniquelevels , byfactor )
        # note: this may not work for all types..
        # i only tested it out on your example.

        # run the svyciprop() function on every unique combo
        all.cis <-
            lapply( 
                uniques , 
                function( i ){

                    svyciprop( 
                        formula , 
                        design[ byfactor %in% byfactor[i] ] ,
                        method = method ,
                        df = df
                    )
                }
            )

        # transpose the svyciprop confidence intervals
        t.cis <- t( sapply( all.cis , attr , "ci" ) )

        # tack on the names
        dimnames( t.cis )[[1]] <- as.character( sort( unique( byfactor ) ) )

        # return the results
        t.cis
    }

# test out the results
svyciby( ~both , ~stype , dclus1 , method = 'likelihood' )
# pretty close to your b, but not exact (as expected)
confint(b)
# and this one does match (as it should)
svyciby( ~both , ~stype , dclus1 , method = 'mean' , df = Inf )