调查包

时间:2018-03-24 18:06:22

标签: r survey

我想从分层抽样设计中估算平均值和总数,其中在每个层中使用单阶段整群抽样。我相信我使用调查包的svydesign()功能正确指定了设计。但我不确定如何正确指定地层权重。

示例代码如下所示。我使用weights=参数提供未经调整的层权重。我预计来自svytotal()的估计和SE将等于地层权重(在示例中为70)乘以估计和来自svymean()的SE的总和。相反,估计值相差530倍(这是计数数据中所有元素的层权重之和),SEs相差898(???)。我的问题是(1)我如何以其理解的方式向svydesign()提供我的3层权重,以及(2)为什么不是来自svytotal()和{{的估算和SE? 1}}因同一因素而不同?

svymean()

首次更新

我添加了一个图表来帮助解释我的设计。整个人口是一个已知区域的湖泊(在这个例子中是70公顷)。地层也有已知区域(10,20和40公顷)。分配给每个阶层的集群数量不成比例。此外,相对于可能被采样的数量,簇是微小的,因此有限总体校正为FPC = 1.

我想计算每单位面积的总体平均值和SE,总计等于该平均值和SE的70倍。

Stratified cluster sampling design

第二次更新

我编写代码从头开始进行计算。我的总估计为920,其中se 61.6。

library(survey)

# example data from a stratified sampling design in which
# single stage cluster sampling is used in each stratum
counts <- data.frame(
  Stratum=rep(c("A", "B", "C"), c(5, 8, 8)), 
  Cluster=rep(1:8, c(3, 2, 3, 2, 3, 2, 3, 3)),
  Element=c(1, 2, 3, 1, 2, 1, 2, 3, 1, 2, 1, 2, 3, 1, 2, 1, 2, 3, 1, 2, 3),
  Count = 1:21
)
# stratum weights
weights <- data.frame(
  Stratum=c("A", "B", "C"),
  W=c(10, 20, 40)
)

# combine counts and weights
both <- merge(counts, weights)

# estimate mean and total count
D <- svydesign(id=~Cluster, strata=~Stratum, weights=~W, data=both)
a <- svymean(~Count, D)
b <- svytotal(~Count, D)

sum(weights$W)  #  70
sum(both$W)     # 530
coef(b)/coef(a) # 530 
SE(b)/SE(a)     # 898.4308

这给出了以下输出:

library(survey)
library(tidyverse)

# example data from a stratified sampling design in which
# single stage cluster sampling is used in each stratum
counts <- data.frame(
  Stratum=rep(c("A", "B", "C"), c(5, 8, 8)),
  Cluster=rep(1:8, c(3, 2, 3, 2, 3, 2, 3, 3)),
  Element=c(1, 2, 3, 1, 2, 1, 2, 3, 1, 2, 1, 2, 3, 1, 2, 1, 2, 3, 1, 2, 3),
  Count = c(5:1, 6:21)
)
# stratum weights
areas <- data.frame(
  Stratum=c("A", "B", "C"),
  A_h=c(10, 20, 40)
)

# calculate cluster means
step1 <- counts %>%
  group_by(Stratum, Cluster) %>%
  summarise(P_hi = sum(Count), m_hi=n())
step2 <- step1 %>%
  group_by(Stratum) %>%
  summarise(
    ybar_h = sum(P_hi) / sum(m_hi),
    n_h = n(),
    sh.numerator = sum((P_hi - ybar_h*m_hi)^2),
    mbar_h = mean(m_hi)
  ) %>%
  mutate(
    S_ybar_h = 1 / mbar_h * sqrt( sh.numerator / (n_h * (n_h-1)) )
  )

# now expand up to strata
step3 <- step2 %>%
  left_join(areas) %>%
  mutate(
    W_h = A_h / sum(A_h)
  ) %>%
  summarise(
    A = sum(A_h),
    ybar_strat = sum(W_h * ybar_h),
    S_ybar_strat = sum(W_h * S_ybar_h / sqrt(n_h))
  ) %>%
  mutate(
    tot = A * ybar_strat,
    S_tot = A * S_ybar_strat
  )

step2
step3

2 个答案:

答案 0 :(得分:1)

svytotal正在做我认为应该做的事情:权重基于抽样概率,因此它们仅针对抽样单位进行定义。 svydesign调用将这些权重应用于集群,并(因为集群抽样)将元素应用于元素,总计高出530倍。您需要提供观察权重或svydesign的足够信息来自行计算。如果这是没有子采样的聚类采样,则可以在聚类上划分地层权重以获得聚类权重,并将其除以聚类中的元素以获得观察权重。或者,如果层数权重是群体中的群集数量,则可以使用fpc参数svydesign

SE与点估计的扩展方式不同的事实是因为人口规模未知并且必须进行估算。平均值是估计总数除以估计的人口规模,SE估计值考虑了分母的方差及其与分子的协方差。

答案 1 :(得分:1)

(修订后的问题的修订答案)

在这种情况下svytotal不是你想要的 - 它是被抽样元素的实际总人口总数,因此当人口被认为比样本无限大时没有意义。整个调查包实际上是针对离散的有限群体而设计的,但我们可以解决它。

我认为你想为每个阶层得到一个均值,然后乘以阶层权重。为此,

D <- svydesign(id=~Cluster, strata=~Stratum, data=both)
means<- svyby(~Count, ~Stratum, svymean, design=D)
svycontrast(means, quote(10*A+20*B+40*C))

你会收到警告

Warning message:
In vcov.svyby(stat) : Only diagonal elements of vcov() available

那是因为svyby不会返回层次方法之间的协方差。这是无害的,因为阶层确实是独立的样本(这就是分层的意思)所以协方差是零。