R 警告消息中的调查包

Survey package in R warning message

我正在尝试使用调查包从随机调查中寻找分类变量的方法。我 运行 使用 svyby() 输出的问题: “警告信息: 在 matrix(1:(ns * reps), ncol = reps, nrow = ns, byrow = TRUE) 中: 数据长度 [12] 不是行数 [5]

的约数或倍数

我的问题有两个:是什么导致了这个以 uninterpretable table 格式重复输出结果的问题?还有一个更理论化的问题,如果我们只是获得手段,那么在创建设计元素之前进行子集化是否存在问题(正如我从其他帖子中了解到的那样,它只会影响 st.errors)。

这是我正在使用的代码,尝试使用完整的调查结果和子集结果:

#read-in zip file
library(survey)
library(rio)
td <- tempdir()
tf <- tempfile(tmpdir=td, fileext=".zip")
download.file("https://www.federalreserve.gov/consumerscommunities/files/SHED_public_use_data_2020_(CSV).zip", tf)
file_names <- unzip(tf, list=TRUE)
unzip(tf, exdir=td, overwrite=TRUE)
data <- import(file.path(td, file_names$Name[1]))

#remove weight NAs
data <- data[!is.na(data$weight_pop),]

#create subset
data.subset <- data[data$BK1 == "Yes" & data$afs == "Yes",]

#create svy designs
design <- svydesign(ids = ~CaseID
                    , weights = ~weight_pop
                    , na.rm = TRUE
                    , data = data) #full survey
design2 <- svydesign(ids = ~CaseID
                    , weights = ~weight_pop
                    , na.rm = TRUE
                    , data = data.subset) #subset of survey

svyby(~BK2_a,~race_5cat,design,svymean)
svyby(~BK2_a,~race_5cat,design2,svymean)

svyby(~BK2_b,~race_5cat,design,svymean)
svyby(~BK2_b,~race_5cat,design2,svymean)

svyby(~BK2_c,~race_5cat,design,svymean)
svyby(~BK2_c,~race_5cat,design2,svymean)

#verify observations
table(data$BK2_a,data$race_5cat)
table(data.subset$BK2_a,data.subset$race_5cat)

table(data$BK2_b,data$race_5cat)
table(data.subset$BK2_b,data.subset$race_5cat)

table(data$BK2_c,data$race_5cat)
table(data.subset$BK2_c,data.subset$race_5cat)

有些结果如我所愿,例如 (~BK2_b,~race_5cat,design2,svymean) 或 (~BK2_c,~race_5cat,design,svymean) 但其他人会抛出警告信息并且有 uninterpretable tables with repeated figures.

使用 table 函数查看观察结果似乎表明问题可能出在“拒绝”响应中,但是当通过“data <- data %>% mutate( BK2_a = str_replace(BK2_a,"Refused", replacement = NA_character_))" 然后 na.rm.all=TRUE 在它引入 NAs 和 NaNs 的 svyby 函数中.我也尝试将列更改为因子,但什么都不做。我是调查包的新手,所以非常感谢任何帮助。

首先,当您想限制到该子组时,我会使用 subset(design, BK1 == "Yes" & afs == "Yes") 而不是在子集数据上创建 design2。但这仅在您关心获得正确的标准错误时才重要,正如您提到的那样。

其次,要解决您的问题,请尝试将响应变量 BK2_aBK2_bBK2_c 编码为因子。或者,如果您想要每个组的比例,您可以直接使用 svytable()。见下文:

data <- data[!is.na(data$weight_pop),]
data$BK2_a_f <- factor(data$BK2_a)
data$BK2_b_f <- factor(data$BK2_b)
data$BK2_c_f <- factor(data$BK2_c)

#create subset
data.subset <- data[data$BK1 == "Yes" & data$afs == "Yes",]

#create svy designs
design <- svydesign(ids = ~CaseID, weights = ~weight_pop, 
                    na.rm = TRUE, data = data) #full survey
design2 <- svydesign(ids = ~CaseID, weights = ~weight_pop, 
                     na.rm = TRUE, data = data.subset) #subset of survey
design2_better <- subset(design, BK1 == "Yes" & afs == "Yes")


svyby(~BK2_a_f, ~race_5cat, design, svymean)
svyby(~BK2_a_f, ~race_5cat, design2, svymean)
svyby(~BK2_a_f, ~race_5cat, design2_better, svymean)

svyby(~BK2_b_f, ~race_5cat, design, svymean)
svyby(~BK2_b_f, ~race_5cat, design2, svymean)
svyby(~BK2_b_f, ~race_5cat, design2_better, svymean)

svyby(~BK2_c_f, ~race_5cat, design, svymean)
svyby(~BK2_c_f, ~race_5cat, design2, svymean)
svyby(~BK2_c_f, ~race_5cat, design2_better, svymean)

# Alternative approach to getting proportions if you don't care about SEs
prop.table(svytable(~race_5cat + BK2_a, design), 1)
prop.table(svytable(~race_5cat + BK2_b, design), 1)
prop.table(svytable(~race_5cat + BK2_c, design), 1)