r - 使用不同类别与子集时,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))
解决方案
我有同样的问题,想补充安东尼的回答,但我还不能发表评论。
正如安东尼指出的那样,有一个错误,survey:::svyboxplot.default
但它似乎与数据点没有任何关系。如果您使用keep.var = FALSE
它FUN=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)))
为了防止框内出现胡须,您可以更改 qrule 以使用不同的方式来计算分位数(例如qrule="hf7"
,对于 quantile() 默认值)。
另一种解决方案是使用 ggplot2 中的加权箱线图:
library(ggplot2)
ggplot(data=col, aes(y=hirvi_sarvisuositus, x=factor(riistakeskus), weight=weights)) +
geom_boxplot()
请注意,ggplot2 对铰链的估计略有不同,请参阅帮助(geom_boxplot),这会影响低 N 的结果。
推荐阅读
- assembly - 在 MIPS 中查找字符串的长度
- php - 只用 preg_replace 替换字符串的第一部分
- ruby-on-rails - 当使用带有 Hyperloop 的设计时,可以从 Rails 控制台访问 Hyperloop::Application.acting_user_id 吗?
- debugging - 使用 ionic serve 或 npm run browser 命令时在 PC 浏览器中运行 InAppBrowser(或模拟它)
- sparql - 我无法在 sparql 选项卡上得到结果
- python - 使用自定义用户模型的 Django 用户注册不起作用
- android - API 26 中后台 HttpsURLConnection 的问题
- python - 在 if 语句匹配中使用第 n 个位置的列表项
- xml - 如何将 XSLT 中的文本(元素的属性)格式化为一行
- reference - 引用如何在绑定表达式的模式中工作?