Ошибка в вычислении взвешенных средних: «x» и «w» должны иметь одинаковую длину - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь вычислить взвешенные доверительные интервалы и для этого нужно использовать взвешенное среднее. Но я продолжаю сталкиваться с той же ошибкой, которую не могу понять, как решить. Данные основаны на Европейском социальном опросе, и я загрузил следующие библиотеки:

library(tidyverse)
library(haven) 
library(essurvey) 
library(radiant.data) 

Следующий код должен выводить, среди прочего, доверительные интервалы:

ESS %>% # Use the ESS, then
  transmute( # Create new variables and only keep these new ones
    # Make the following variables factors:
    cntry = as_factor(cntry), 
    # Make the following variables numeric:
    pspwght = zap_labels(pspwght),
    hmsacld = max(zap_labels(hmsacld), na.rm = TRUE) - zap_labels(hmsacld), #Turning scale around
  ) %>%
  group_by(cntry) %>% # Group data by country, then
  summarize(
    n = sum(pspwght, na.rm = TRUE),
    mean_hmsacld = weighted.mean(hmsacld, pspwght, na.rm = TRUE), 
    sd_hmsacld = weighted.sd(hmsacld, pspwght), 
    se_hmsacld = sd_hmsacld / sqrt(n),
    min95 = mean_hmsacld - se_hmsacld * qt(p = 0.975, df = n),
    max95 = mean_hmsacld + se_hmsacld * qt(p = 0.975, df = n)
  )

Вместо этого я получить следующую ошибку:

Error in weighted.mean.default(x, wt) : 
  'x' and 'w' must have the same length

Есть идеи, как это исправить?

Спасибо

1 Ответ

0 голосов
/ 20 февраля 2020

У вас есть NA в столбце hmsacld, который вызывает ошибку, которую вы наблюдаете. Если вы хотите weighted.mean, вам нужно предоставить веса для каждого pspwght. Простой эксперимент - давайте отбросим все строки с NA внутри ESS:

library(tidyverse)
library(haven)
library(essurvey) 
library(radiant.data)

ESS <- structure(list(cntry = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("AT", 
"BE", "CH", "CZ", "DE", "EE", "ES", "FI", "FR", "GB", "HU", "IE", 
"IL", "IS", "IT", "LT", "NL", "NO", "PL", "PT", "RU", "SE", "SI"
), class = "factor"), pspwght = c(1.17849552631378, 0.899471521377563, 
0.31575334072113, 0.472467392683029, 2.24670553207397, 1.01137900352478, 
1.83802974224091, 1.20280182361603, 0.320830971002579, 0.99757444858551, 
0.550059616565704, 0.691191911697388, 0.411176264286041, 0.673080623149872, 
1.28033947944641, 0.647780179977417, 2.93387079238892, 0.374067783355713, 
0.696788847446442, 0.699867308139801), hmsacld = c(4, 4, 2, 3, 
4, 1, NA, 2, 2, 1, 4, 2, 3, 3, 0, 4, 3, 1, 3, 4)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -20L))


ESS %>% # Use the ESS, then
  transmute( # Create new variables and only keep these new ones
    # Make the following variables factors:
    cntry = as_factor(cntry), 
    # Make the following variables numeric:
    pspwght = zap_labels(pspwght),
    hmsacld = max(zap_labels(hmsacld), na.rm = TRUE) - zap_labels(hmsacld), #Turning scale around
  ) %>%
  drop_na() %>% 
  group_by(cntry) %>% # Group data by country, then
  summarize(
    n = sum(pspwght, na.rm = TRUE),
    mean_hmsacld = weighted.mean(hmsacld, pspwght, na.rm = TRUE), 
    sd_hmsacld = weighted.sd(hmsacld, pspwght), 
    se_hmsacld = sd_hmsacld / sqrt(n),
    min95 = mean_hmsacld - se_hmsacld * qt(p = 0.975, df = n),
    max95 = mean_hmsacld + se_hmsacld * qt(p = 0.975, df = n)
  )

С уважением, Павел

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...