Установите собственный уровень достоверности в svymean при использовании пакета опросов svyby in r

Я запускаю код для поиска взвешенных средних по группе с доверительными интервалами для нескольких переменных в моем наборе данных. Мой код выглядит следующим образом, демонстрируя использование пакета mtcars:

library(survey)
library(tidyverse)
var_list = c("wt","qsec")
  
svy_design <- svydesign(
  ids = ~1, 
  data = mtcars |> 
    dplyr::select(cyl,all_of(var_list),mpg) |> 
    na.omit(),
  weights =  mtcars |> 
    dplyr::select(cyl,all_of(var_list),mpg) |> 
    na.omit() |> select(mpg)
)

lapply(var_list, function( x ) svyby(as.formula( paste0( "~" , x ) ) ,
                     by = ~cyl, 
                     design = svy_design, 
                     FUN = svymean,
                     keep.names = FALSE, vartype = "ci")) %>% 
  bind_rows() |> relocate(wt, .after = last_col()) %>%  pivot_longer(!c(cyl,ci_l,ci_u),names_to = "var",values_to = "mean",values_drop_na = TRUE)


Это прекрасно работает и дает желаемый результат доверительных интервалов для каждой переменной. Однако когда я пытаюсь переключить доверительный интервал со значения по умолчанию 0,95, я получаю ошибки:

library(survey)
library(tidyverse)
var_list = c("wt","qsec")
  
svy_design <- svydesign(
  ids = ~1, 
  data = mtcars |> 
    dplyr::select(cyl,all_of(var_list),mpg) |> 
    na.omit(),
  weights =  mtcars |> 
    dplyr::select(cyl,all_of(var_list),mpg) |> 
    na.omit() |> select(mpg)
)

lapply(var_list, function( x ) svyby(as.formula( paste0( "~" , x ) ) ,
                     by = ~cyl, 
                     design = svy_design, 
                     FUN = svymean(level = 0.99),
                     keep.names = FALSE, vartype = "ci")) %>% 
  bind_rows() |> relocate(wt, .after = last_col()) %>%  pivot_longer(!c(cyl,ci_l,ci_u),names_to = "var",values_to = "mean",values_drop_na = TRUE)

Error in svymean(level = 0.99) : 
  argument "design" is missing, with no default

Как я могу использовать svymean внутри svyby и установить собственный уровень доверительного интервала?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первая проблема заключается в том, что FUN должна быть функцией, которая принимает формулу и дизайн в качестве первых двух аргументов, поэтому вам нужно просто предоставить FUN = svymean и любые другие аргументы FUN внутри ....

Однако на самом деле доверительный интервал рассчитывается путем установки vartype = "ci" в svyby, который вызывает survey:::confint.svyby внутри и не обеспечивает никакого контроля над уровнем достоверности.

Обойти это можно, рассчитав CI отдельно:

step1 <- lapply(var_list, \(x) {
  ## Just a standard error - do NOT change vartype=... here!
  d1 <- svyby(as.formula(paste0("~", x)) ,
              by = ~cyl, 
              design = svy_design, 
              FUN = svymean,
              keep.names = FALSE)
  ## NOW calculate the CI with the desired level
  d2 <- confint(d1, level = .99)
  ## Combine results
  d1[,c("ci_l", "ci_u")] <- d2
  dplyr::select(d1, -"se")
})

Остальная часть конвейера остается без изменений:

bind_rows(step1) %>%
  relocate(wt, .after = last_col()) %>%
  pivot_longer(!c(cyl, ci_l, ci_u),
               names_to = "var",
               values_to = "mean",
               values_drop_na = TRUE)

#> A tibble: 6 × 5
#>     cyl  ci_l  ci_u var    mean
#>   <dbl> <dbl> <dbl> <chr> <dbl>
#> 1     4  1.80  2.64 wt     2.22
#> 2     6  2.78  3.43 wt     3.10
#> 3     8  3.48  4.36 wt     3.92
#> ...

Большое спасибо, это сработало как шарм! И я ценю подробное объяснение!

flâneur 09.04.2024 23:31

Другие вопросы по теме