簡體   English   中英

R警告消息中的調查包

[英]Survey package in R warning message

我正在嘗試使用調查包從隨機調查中查找分類變量的均值。 我在使用 svyby() 時遇到了一個輸出問題:“警告消息:在矩陣中(1:(ns * reps),ncol = reps,nrow = ns,byrow = TRUE):數據長度 [12] 不是一個行數的約數或倍數 [5]"

我的問題有兩個方面:是什么導致了這個以無法解釋的表格格式重復輸出結果的問題? 還有一個更理論的問題,如果我們只是獲得手段,在創建設計元素之前是否存在子集問題(據我從其他帖子中了解到,它只會影響st.錯誤)。

這是我正在使用的代碼,試圖使用完整的調查結果和子集結果:

#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) 但其他結果會拋出警告消息,並有無法解釋的表格和重復的數字.

使用表函數查看觀察結果似乎表明問題可能出在“拒絕”響應中,但是當通過“數據 <- 數據 %>% mutate(BK2_a = str_replace(BK2_a,"Refused")用 NA 替換此響應時,replacement = NA_character_))" 然后在 svyby 函數中 na.rm.all=TRUE 它引入了 NA 和 NaN。 我也嘗試將列更改為因子,但什么也不做。 我是調查包的新手,因此非常感謝任何幫助。

首先,當您想限制到該子組時,我不會在子集數據上創建 design2,而是使用子集(設計,BK1 == "Yes" & afs == "Yes")。 但這只有在您關心獲得正確的標准錯誤時才重要,正如您所提到的。

其次,要解決您的問題,請嘗試將響應變量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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM