使用调查包 (svymean) 输出 N

Outputting the N's using the survey package (svymean)

我有这样的数据,我正在尝试使用调查包来应用权重并从每个变量中找到均值、SE 和 N。

我能够找到均值和 SE,但我不知道如何为每个变量提取 N。

library(survey)
data(api)
dclus1<-svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc)
vector_of_variables <- c( 'api00' , 'api99' )
result <- 
    lapply( 
        vector_of_variables , 
        function( w ) svymean( as.formula( paste( "~" , w ) ) , dclus1 , na.rm = TRUE ) 
    )

result <- lapply( result , function( v ) data.frame( variable = names( v ) , mean = coef( v ) , se = as.numeric( SE( v ) ) ) )

do.call( rbind , result )

有什么建议吗?


编辑

我修改了下面给出的答案以扩展我的问题:

library(survey)
data(api)
apiclus1 <- 
  apiclus1 %>% 
  mutate(pw2 = pw*0.8) %>%
  mutate(part = case_when(full<80 ~"part 1", TRUE~"part 2"))

dclus1<-svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc)

dclus2 <- svydesign(id=~dnum, weights=~pw2, data=apiclus1, fpc=~fpc)

meanseN<-function(variable,design, part,shc.wide){
  formula<-make.formula(variable)
  m <-svymean(formula, subset(design, part==part, shc.wide = shc.wide),na.rm=TRUE)
  N<-unwtd.count(formula, subset(design, part==part, shc.wide = shc.wide),na.rm=TRUE)
  c(mean=coef(m), se=SE(m), N=coef(N))
}

vector_of_variables <- c("acs.k3","api00")
 


sapply(vector_of_variables, meanseN, "part 1","No",design=dclus1)

                     acs.k3     api00
mean.acs.k3  20.0347222 644.16940
se            0.5204887  23.54224
N.counts    144.0000000 183.00000

如您所见,我对数据 (dclus1) 进行了子集化,因此我希望看到的每个设计的 N 应该是:

table(apiclus1$sch.wide, apiclus1$part)

      part 1 part 2
  No       4     19
  Yes     30    130

unwtd.count 正在返回完整数据样本的计数,而不是子集....知道为什么会发生这种情况吗?

您实际上不需要调查包函数来执行此操作。观察的数量是任意的,它不是基于设计的人口估计。然而,pacakage 确实有函数 unwtd.count 来获得 non-missing 观察的未加权计数,例如

> unwtd.count(~api00, dclus1)
       counts SE
counts    183  0

如果你想像以前一样在一个循环中完成这三件事,那么与其在一行中完成,不如编写一个小函数更容易

meanseN<-function(variable,design){
    formula<-make.formula(variable)
    m <-svymean(formula, design,na.rm=TRUE)
    N<-unwtd.count(formula, design)
    c(mean=coef(m), se=SE(m), N=coef(N))
}

然后做类似

的事情
> sapply(vector_of_variables, meanseN,design=dclus1)
               api00     api99
mean.api00 644.16940 606.97814
se          23.54224  24.22504
N.counts   183.00000 183.00000