Доверительные интервалы в пропорции свыбы
Существует ли существующая функция, которая создает доверительные интервалы из 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, который сравнивает пропорцию переменной "оба" в стиле
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
? В основном это должно было бы пройти каждый уровень svyby
объект и создать доверительный интервал. Мои попытки были безуспешны до сих пор.
Может быть другой способ обойти это, но мне нравится использовать svyby()
как это быстро и интуитивно понятно.
2 ответа
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"))
Интересно.. эти две команды не должны давать одинаковый результат.. первая, вероятно, должна выдать ошибку или предупреждение:
svyby( ~both , ~stype , dclus1 , svyciprop , method = 'likelihood' )
svyby( ~both , ~stype , dclus1 , svymean )
возможно, вы захотите предупредить доктора Ламли об этой проблеме - код рядом со строкой 80 surveyby.R
может быть немного изменен, чтобы получить 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 )