首页 > 解决方案 > 使用不同类别与子集时,svyboxplot 结果会发生变化

问题描述

我是调查包的新手,有一个神秘的问题。我使用 anesrake 包制作了数据权重,然后创建了一个调查设计。

我在使用 svyboxplot 和分组变量时遇到问题:它为每个分组类别绘制了相似的箱线图,这是不正确的

当我研究对我的每个类别(其中 15 个)进行子集化的问题时,每个区域的值都不同/每个区域的箱线图不同。

谁能帮我?生无可恋!

这是要测试的样本

library(tidyverse)

col <- tibble(
name = c("seura 1", "seura 2", "seura 3", "seura 4", "seura 5", "seura 6", "seura 7", "seura 8", "seura 9"
, "seura 10", "seura 11", "seura 12"),
riistakeskus = c("Keski-Suomi","Keski-Suomi","Keski-Suomi","Keski-Suomi","Keski-Suomi","Satakunta","Satakunta",
"Satakunta","Uusimaa", "Uusimaa","Uusimaa","Uusimaa"),
hirvi_sarvisuositus = c(1,4,5,3,7,5,3,4,6,5,8,9),
weights = c(1.1461438,1.1461438,1.1461438,1.1461438,1.1461438,0.5107815,0.5107815,0.5107815,2.0461937,
2.0461937,2.0461937,2.0461937)
)
library(survey)

my_des1 <- svydesign(data = col, weights = ~weights, ids = ~1)
b <- svyboxplot(hirvi_sarvisuositus~factor(riistakeskus), my_des1, all.outliers = F, ylim = c(0,10))
svyboxplot(hirvi_sarvisuositus~1, subset(my_des1, riistakeskus == "Keski-Suomi"), ylim = c(0,10))
svyboxplot(hirvi_sarvisuositus~1, subset(my_des1, riistakeskus == "Satakunta"), ylim = c(0,10))
svyboxplot(hirvi_sarvisuositus~1, subset(my_des1, riistakeskus == "Uusimaa"), ylim = c(0,10))

标签: rboxplotsurvey

解决方案


我有同样的问题,想补充安东尼的回答,但我还不能发表评论。

正如安东尼指出的那样,有一个错误,survey:::svyboxplot.default但它似乎与数据点没有任何关系。如果您使用keep.var = FALSEFUN=svyquantile,则返回整体分位数而不是组特定分位数。

相比

svyby(~hirvi_sarvisuositus, ~riistakeskus, my_des1, svyquantile, ci = FALSE, 
        keep.var = FALSE, quantiles = c(0, 0.25, 0.5, 0.75, 1), 
        na.rm = TRUE)

svyquantile(~hirvi_sarvisuositus, my_des1, 
        quantiles = c(0, 0.25, 0.5, 0.75, 1), 
        na.rm = TRUE)

请注意,svyquantile 无法计算某些分位数的 SE。

如果您keep.var=TRUE改为使用并尝试提取 CI,则会按组获得分位数。

svyby(~hirvi_sarvisuositus, ~riistakeskus, my_des1, svyquantile,
         quantiles = c(0, 0.25, 0.5, 0.75, 1), ci=TRUE, na.rm = TRUE, 
  keep.var = TRUE, vartype = "ci")

但是,您不能svyquantile在调用时更改函数选项svyboxplot。这需要在包中修复。您可以自己构建箱线图。一个简单的基础 R 解决方案:

q <- svyby(~hirvi_sarvisuositus, ~riistakeskus, my_des1, svyquantile,       
    quantiles = c(0, 0.25, 0.5, 0.75, 1), na.rm = TRUE, ci=TRUE, 
    keep.var = TRUE, 
    vartype = "ci")

boxstats <- q[,2:6]

bxp(list(stats=t(as.matrix(boxstats)),
         n = c(100,100,100),
         names = rownames(boxstats)))

使用 svyby-values 构建的基本 R 箱线图

为了防止框内出现胡须,您可以更改 qrule 以使用不同的方式来计算分位数(例如qrule="hf7",对于 quantile() 默认值)。

另一种解决方案是使用 ggplot2 中的加权箱线图:

library(ggplot2)
ggplot(data=col, aes(y=hirvi_sarvisuositus, x=factor(riistakeskus), weight=weights)) + 
  geom_boxplot()

使用 ggplot2 的加权 geom_boxplot 解决方案

请注意,ggplot2 对铰链的估计略有不同,请参阅帮助(g​​eom_boxplot),这会影响低 N 的结果。


推荐阅读