是否存在创建置信区间的现有函数
来自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
,因为它快速而直观。
答案 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行附近的代码,以使svyciprop
在svyby
内工作。
但我可能会忽略一些东西(他可能已在文档中的某处注明了它),
因此,在与他联系之前,请务必仔细阅读所有内容
无论如何,这是一个可以解决问题的临时解决方案
# 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 )