【问题标题】:svyboxplot results change when using different categories versus subsets使用不同类别与子集时,svyboxplot 结果会发生变化
【发布时间】:2021-10-22 12:01:18
【问题描述】:

我是调查包的新手,遇到了一个神秘问题。我使用 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))

【问题讨论】:

    标签: r boxplot survey


    【解决方案1】:

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

    survey:::svyboxplot.default 有一个错误,正如 Anthony 所指出的,但它似乎与数据点没有任何关系。如果您将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")
    

    但是,当调用svyboxplot 时,您不能更改svyquantile 函数选项。这需要在包中修复。您可以自己构建箱线图。一个简单的基础 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)))
    

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

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

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

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

    【讨论】:

      【解决方案2】:

      很好的可重现示例,谢谢!这个结果特别傻

      svyboxplot(hirvi_sarvisuositus~riistakeskus,my_des1,ylim=c(0,10))
      

      我认为这主要是因为svyquantile 只需要更多的数据点来获得合理的估计..

      如果您查看survey:::svyboxplot.default 中的代码,您会发现产生所有相同分位数结果的行

      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)
              
      

      不确定这是否真的是 survey 软件包作者想要修复的错误。如果您的用例有这么小的数据集,也许考虑使用 ?bxp 函数?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 2019-05-23
        • 2010-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多