使用调查包查找 SE 和交叉表

Using the survey package to find SE's and crosstabulations

我正在使用 Thomas Lumley 的 survey package 创建交叉表和 SE。我正在努力指定交叉表的分母。

这是我的数据:

    library(survey)
    data <- read_table2("Q50_1   Q50_2   Q38 Q90 pov gender  wgt id
    yes   3   Yes NA   High    M   1.3 A
    NA   4   No  2   Med F   0.4 B
    no   2   NA 4   Low F   1.2 C
    maybe   3   No  2   High    M   0.5 D
    yes   NA   No  NA   High    M   0.7 E
    no   2   Yes 3   Low F   0.56 F
    maybe   4   Yes 2   Med F   0.9 G")
    
    

创建设计对象:

    design <- svydesign(id =~id,
                            weights  = ~wgt,
                            nest = FALSE,
                            data = data)

查找 Q50_1 的交叉表按女性:

svymean(~interaction(Q50_1,gender=="F"), design, na.rm = T)

这给了我:

                                                 mean     SE
interaction(Q50_1, gender == "F")maybe.FALSE 0.096899 0.1043
interaction(Q50_1, gender == "F")no.FALSE    0.000000 0.0000
interaction(Q50_1, gender == "F")yes.FALSE   0.387597 0.2331
interaction(Q50_1, gender == "F")maybe.TRUE  0.174419 0.1725
interaction(Q50_1, gender == "F")no.TRUE     0.341085 0.2233
interaction(Q50_1, gender == "F")yes.TRUE    0.000000 0.0000

这对我来说没那么有用,因为分母包含每个组合的 TRUE FALSE 值,而我只对真实的平均值感兴趣。所以,我可以很容易地找到 TRUE 的百分比如下:

dat <- as.data.frame(svymean(~interaction(Q50_1,gender=="F"), design, na.rm = T)) %>% tibble::rownames_to_column("question")

dat %>%   tidyr::separate(question,c("question",'response'), sep = "\)", extra = "merge") %>%
    mutate(question = str_replace(question,"interaction\("," ")) %>%
    tidyr::separate(response,c('value', 'bool'), sep ="\." ) %>% 
    tidyr::separate(question,c('question', 'group'), sep ="\," ) %>% 
    tidyr::separate(group,c('group_level', 'group'), sep ="\==" ) %>% 
    
    filter(bool=='TRUE') %>%
    group_by(question, group_level, group) %>%
    mutate(sum_true = sum(mean)) %>%
    mutate(mean= mean/sum_true)

这给了我:

  question group_level group    value bool   mean    SE sum_true
  <chr>    <chr>       <chr>    <chr> <chr> <dbl> <dbl>    <dbl>
 " Q50_1" " gender "  " \"F\"" maybe TRUE  0.338 0.173    0.516
 " Q50_1" " gender "  " \"F\"" no    TRUE  0.662 0.223    0.516
 " Q50_1" " gender "  " \"F\"" yes   TRUE  0     0        0.516

均值正是我想要的,但 SE 与不同的分母相关联并且不代表操纵均值。有没有办法调用 svymean 来呈现分母中仅 TRUE 值的平均值和标准误差?

我认为这样的事情可能会起作用(但它不起作用):

svymean(~interaction(Q50_1,gender=="F"[TRUE]), design, na.rm = T)

我想要的结果(SE 是假的):

                                                      mean     SE
interaction(Q50_1, gender == "F"[TRUE])maybe.TRUE  0.338     0.0725
interaction(Q50_1, gender == "F"[TRUE])no.TRUE     0.0.662   0.0233
interaction(Q50_1, gender == "F"[TRUE])yes.TRUE    0.0       0.0000

获得回答您想要的每个答案的女性百分比

svymean(~Q50_1, subset(design, gender== "F"),na.rm=TRUE)

或等效(因为 svyby 就是这样做的)

svyby(~Q50_1, ~gender, design, svymean, na.rm = TRUE)

如果您还想获得空类别,则需要将 ~Q50_1 变量转换为一个因子——这就是因子(相对于字符串)的要点:它们知道它们的级别。

如果您能够以编程方式提取部分输出,请使用 coefSE 函数

data$Q50_1<-factor(data$Q50_1)
design <- svydesign(id =~id,
                             weights  = ~wgt,
                             nest = FALSE,
                             data = data)
                             
 svymean(~Q50_1, subset(design, gender== "F"),na.rm=TRUE)
 svyby(~Q50_1, ~gender, design, svymean, na.rm = TRUE)[1,]

 coef(svyby(~Q50_1, ~gender, design, svymean, na.rm = TRUE)) 
 SE(svyby(~Q50_1, ~gender, design, svymean, na.rm = TRUE))                             

这些与您使用 ~interaction 获得的结果不一致,因为您通过这种方式获得的结果与您所说的不符。 interaction 分析为您提供的是 yes 女性回复者的百分比,而不是 yes 女性回复者的百分比。换句话说,通过 interaction 分析得到的 6 个百分比加起来是 100%,而不是 200%。

> sum(coef(svymean(~interaction(Q50_1,gender=="F"), design, na.rm = T)))
[1] 1