Воспроизведено из этого кода:
library(haven)
library(survey)
library(dplyr)
nhanesDemo <- read_xpt(url("https://wwwn.cdc.gov/Nchs/Nhanes/2015-2016/DEMO_I.XPT"))
# Rename variables into something more readable
nhanesDemo$fpl <- nhanesDemo$INDFMPIR
nhanesDemo$age <- nhanesDemo$RIDAGEYR
nhanesDemo$gender <- nhanesDemo$RIAGENDR
nhanesDemo$persWeight <- nhanesDemo$WTINT2YR
nhanesDemo$psu <- nhanesDemo$SDMVPSU
nhanesDemo$strata <- nhanesDemo$SDMVSTRA
nhanesAnalysis <- nhanesDemo %>%
mutate(LowIncome = case_when(
INDFMIN2 < 40 ~ T,
T ~ F
)) %>%
# Select the necessary columns
select(INDFMIN2, LowIncome, persWeight, psu, strata)
# Set up the design
nhanesDesign <- svydesign(id = ~psu,
strata = ~strata,
weights = ~persWeight,
nest = TRUE,
data = nhanesAnalysis)
svyhist(~log10(INDFMIN2), design=nhanesDesign, main = '')
Как раскрасить гистограмму независимой переменной, например, LowIncome? Я хочу иметь две отдельные гистограммы, по одной для каждого значения LowIncome. К сожалению, я выбрал плохой пример, но я хочу, чтобы они были прозрачными, если их значения перекрываются.
Если вы хотите построить гистограмму из своей модели, вы можете получить ее данные из model.frame (это то, что svyhist делает под капотом). Чтобы получить гистограмму, заполненную группой, вы можете использовать этот фрейм данных внутри ggplot:
library(ggplot2)
ggplot(model.frame(nhanesDesign), aes(log10(INDFMIN2), fill = LowIncome)) +
geom_histogram(alpha = 0.5, color = "gray60", breaks = 0:20 / 10) +
theme_classic()
Редактировать
Как указывает Томас Ламли, это не включает веса выборки, поэтому, если вы хотите, вы можете сделать это:
ggplot(model.frame(nhanesDesign), aes(log10(INDFMIN2), fill = LowIncome)) +
geom_histogram(aes(weight = persWeight), alpha = 0.5,
color = "gray60", breaks = 0:20 / 10) +
theme_classic()
Чтобы продемонстрировать, что этот подход работает, мы можем воспроизвести подход Томаса в ggplot, используя пример данных из svyhist. Чтобы получить неравномерные размеры ячеек (если это желательно), нам нужны два слоя гистограммы, хотя я предполагаю, что это не потребуется для большинства случаев использования.
ggplot(model.frame(dstrat), aes(enroll)) +
geom_histogram(aes(fill = "E", weight = pw, y = after_stat(density)),
data = subset(model.frame(dstrat), stype == "E"),
breaks = 0:35 * 100,
position = "identity", col = "gray50") +
geom_histogram(aes(fill = "Not E", weight = pw, y = after_stat(density)),
data = subset(model.frame(dstrat), stype != "E"),
position = "identity", col = "gray50",
breaks = 0:7 * 500) +
scale_fill_manual(NULL, values = c("#00880020", "#88000020")) +
theme_classic()
@ThomasLumley хорошая мысль. Я обновил, чтобы показать, как использовать веса выборки в рамках ggplot, включая версию ggplot вашего прекрасно продемонстрированного примера. Спасибо.
Вы не можете просто извлечь данные и использовать ggplot, потому что это не будет использовать веса и поэтому упускает весь смысл svyhist. Однако вы можете использовать аргумент add=TRUE. Вам нужно правильно установить диапазоны осей x и y, чтобы убедиться, что весь график виден
Используя пример данных из ?svyhist
svyhist(~enroll, subset(dstrat,stype= = "E"), col = "#00880020",ylim=c(0,0.003),xlim=c(0,3500))
svyhist(~enroll, subset(dstrat,stype! = "E"), col = "#88000020",add=TRUE)
Проблема в том, что он не использует веса выборки.