найти взвешенную частоту и se для вектора переменных

#r #dplyr #survey

#r #dplyr #обзор

Вопрос:

Я хотел бы найти взвешенные частоты с их SE для всех переменных в моих данных.

 df <- data.frame(sex = c('F', 'M', 'F', 'M', 'M', 'M', 'F', 'F'),
                 married = c(1,1,1,1,0,0,1,1),
                 pens = c(0, 1, 1, 1, 1, 1, 0, 0),
                 weight = c(1.12, 0.55, 1.1, 0.6, 0.23, 0.23, 0.66, 0.67))

design <- svydesign(ids=~1, data=df, weights=~weight)
  

Чтобы получить взвешенные частоты для одной переменной:

 svymean(~interaction(married), design)

                          mean     SE
interaction(married)0 0.089147 0.0717
interaction(married)1 0.910853 0.0717
  

Мой фактический набор данных большой, и я хочу запустить это для ВСЕХ переменных сразу.

 vars <- c("sex","married","pens")
  

Я пробовал это, но это выдает ошибку.

 svymean(~interaction(reformulate(vars)), design)

Error in unique.default(x, nmax = nmax) : 
  unique() applies only to vectors
  

Я также могу это сделать — но запуск svytable мне не помогает, потому что мне нужны SE.

 for(i in  seq_along(vars)){
    print(prop.table(svytable(bquote(~.(as.name(vars[i]))), design)))
 }
  

Редактировать

Я хочу запустить svymean(~ interaction (var), design) для каждой переменной в моем df отдельно. Поэтому вместо того, чтобы запускать это много раз, вот так:

 svymean(~interaction(married), design)
svymean(~interaction(sex), design)
svymean(~interaction(pen), design)
  

Я хочу иметь возможность выполнять эту команду для каждой переменной в моем векторном списке имен (vars).

Есть предложения !??

Ответ №1:

Мы могли бы использовать paste для создания формулы

 out1 <- svymean(as.formula(paste0('~interaction(', toString(vars), ')')), design)

out1
#                                         mean     SE
#interaction(sex, married, pens)F.0.0 0.000000 0.0000
#interaction(sex, married, pens)M.0.0 0.000000 0.0000
#interaction(sex, married, pens)F.1.0 0.474806 0.2109
#interaction(sex, married, pens)M.1.0 0.000000 0.0000
#interaction(sex, married, pens)F.0.1 0.000000 0.0000
#interaction(sex, married, pens)M.0.1 0.089147 0.0717
#interaction(sex, married, pens)F.1.1 0.213178 0.1945
#interaction(sex, married, pens)M.1.1 0.222868 0.1567
  

тестирование с ручным вводом

 out2 <- svymean(~interaction(sex,married, pens), design)
identical(out1, out2)
#[1] TRUE
  

Обновить

Чтобы сделать это отдельно, мы можем использовать lapply

 outlst1 <- lapply(vars, function(x) 
    svymean(as.formula(paste0('~interaction(', x, ')')), design))

outlst1
#[[1]]
#                     mean     SE
#interaction(sex)F 0.68798 0.1721
#interaction(sex)M 0.31202 0.1721

#[[2]]
#                          mean     SE
#interaction(married)0 0.089147 0.0717
#interaction(married)1 0.910853 0.0717

#[[3]]
#                      mean     SE
#interaction(pens)0 0.47481 0.2109
#interaction(pens)1 0.52519 0.2109
  

Комментарии:

1. Спасибо! Это действительно хорошо работает для небольшого набора данных, но эта команда выполняется около 10 минут без каких-либо результатов с моим df с 200 переменными и 2000 наблюдениями.

2. @NewBee с 200 переменными, взаимодействием, будет много комбинаций

3. Спасибо, что указали на это — я допустил ошибку в своем сообщении, исправлю ее, я хочу запускать svymean для каждой переменной отдельно, а не как единый вектор в сочетании друг с другом.

4. @NewBee Извините, я думал, вы хотите взаимодействовать со всем, вот почему у него возникла проблема

5. @NewBee Вы можете сделать lapply(vars, function(x) {svmean <- svymean(as.formula(paste0('~interaction(', x, ')')), design); sytbl <- svytable(as.formula(paste0('~interaction(', x, ')')), design); list(svmean, sytbl))