Я запускаю код для поиска взвешенных средних по группе с доверительными интервалами для нескольких переменных в моем наборе данных. Мой код выглядит следующим образом, демонстрируя использование пакета 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
и установить собственный уровень доверительного интервала?
Первая проблема заключается в том, что 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
#> ...
Большое спасибо, это сработало как шарм! И я ценю подробное объяснение!