在Svydesign对象中通过十分位数计算平均值

时间:2019-05-06 20:19:25

标签: r mean survey quantile

因此,我正在使用ENIGH-数据库,该数据库代表西班牙语的“家庭收入和支出的国家调查”,这是墨西哥政府进行的一项工作,与大多数此类调查一样,它也可以使用权重

我想做的是通过Decile计算家庭平均收入,最高收入和最低收入。换句话说,每10%的收入是多少,即根据他们的收入对家庭进行分组。 老实说,我还没走那么远,但这是我到目前为止得到的:

  1. 我需要我的svydesign对象
  2. 使用svytable将其转换为表格
  3. 在我的收入变量上使用desc()安排
Map<String, Long> map = dummyString.chars() // Turn the String to an IntStream
        .boxed() // Turn int to Integer to use Collectors.groupingBy
        .collect(Collectors.groupingBy(
                Character::toString,     // Use the character as a key for the map
                Collectors.counting())); // Count the occurrences

这里是棘手的地方,假设我有100行,我不能接受其中的前10行,因为实际上,考虑到权重,可能是9%或20%(我只是在扔数字)。

我可以在收入变量中使用ENIGH_design <-svydesign(id=~upm, strata=~est_dis, weights=~factor_hog, data = ENIGH) ENIGH_table <- svytable(ing_cor, ENIGH_design) ,但我会忘记权重,结果将仅代表样本,而不代表总人口。

我认为最好的方法是使用以下组合:

  • cut()创建一个新的变量库
  • mutate()与mutate共同定义每行落在哪个十分位上
  • if()group_by()来计算我的目标

这样,我将拥有一个额外的变量,该变量可用于计算所需的任何其他变量。但是,我还没有定义我的组,所以这几乎没有用。

感谢您的阅读。谢谢您的帮助。

可用数据库:https://www.inegi.org.mx/programas/enigh/nc/2016/default.html#Datos_abiertos

以下是我数据库的外观:

mean()

还有更多的列,但对于本练习来说不是必需的。

1 个答案:

答案 0 :(得分:0)

制作一个看起来像这样的表(dataframe,data.table或tibble):

> dt
folioviv    factor    ing_tri
       1       247      30000
       2       200      15000
       3       150      50000
incomes <- rep(dt$ing_tri, times = dt$factor)
deciles <- quantile(incomes, probs = seq(0.1, 1, by = 0.1), names = TRUE)

如果我是你,我会尝试使用names = FALSE使其可操作。否则,它将是一个命名列表,这有点烦人。

哦,要计算平均值,只需执行mean(incomes)

PS:folioviv列实际上不是必需的,但您可能希望将其放在此以防万一。