关于R中svydesign函数FPC抽样超100%错误的技术问询
解决survey包svydesign函数的
FPC implies >100% sampling in some strata错误 错误原因
- 这个错误核心是第二阶段抽样的样本量超过了该阶段集群的总体规模。虽然你没显式指定
strata参数,但survey包会默认把上一阶段的集群(这里是dnum对应的区县)当作第二阶段抽样的分层依据。 - 你的数据集存在逻辑矛盾:每个
dnum对应200个样本,且snum是1到1000的唯一值——这相当于你在一个区县里抽了200个学校,但你设置的fpc2(学校总体规模)只有5-10,抽样比例远超100%,不符合现实抽样逻辑,因此包抛出错误。 - 你的
snum设置违背了两阶段集群抽样的结构:两阶段抽样应该是「抽区县→抽区县内的学校→抽学校内的学生」,同一学校的样本要共享相同的snum,而非每个样本对应唯一snum。
解决方法
1. 修正抽样结构逻辑
调整数据集,让它匹配两阶段集群抽样的层级:
- 第一阶段:确定总体区县数量,抽取部分或全部区县
- 第二阶段:从抽中的区县里抽取部分或全部学校
- 每个学校下包含多个学生样本,同一学校的样本使用相同的
snum
2. 修正示例代码
以下是符合逻辑的数据集构建和抽样设计代码:
library(survey) library(dplyr) set.seed(111) # 构建两阶段抽样数据集:5个区县,每个区县10所学校,每所学校20个学生 status <- expand.grid( dnum = c(441, 512, 39, 99, 61), # 抽中的区县 snum = 1:10, # 每个区县内的学校编号(假设抽取全部10所) student_id = 1:20 # 每所学校内的学生样本 ) %>% mutate( mood = sample(c("happy", "neutral", "grumpy"), n(), replace = TRUE, prob = c(0.3, 0.3, 0.4)), sex = sample(c("female", "male"), n(), replace = TRUE, prob = c(0.6, 0.4)), age_group = sample(c("young", "middle", "senior"), n(), replace = TRUE, prob = c(0.2, 0.6, 0.2)), income = trunc(runif(n(), 1000, 2000)), fpc1 = 200, # 第一阶段FPC:总体区县总数(假设从200个区县中抽取5个) fpc2 = 10 # 第二阶段FPC:每个区县的总体学校数(假设每个区县有10所学校) )
3. 重新创建抽样设计
design <- svydesign( ids = ~dnum + snum, # 第一阶段集群:区县;第二阶段集群:学校 fpc = ~fpc1 + fpc2, # 对应各阶段的总体规模 data = status )
如果实际抽样中仅抽取部分学校(比如每个区县抽5所),只需将snum调整为1:5,保持fpc2=10即可,此时抽样比例为50%,不会超过100%。
内容的提问来源于stack exchange,提问作者An116
相关产品推荐
相关产品推荐

