我已经为你分成了几个功能
加载 data.table、SimDesign 和 splitstackshape
library(SimDesign)
library(data.table)
library(splitstackshape)
获取n
大小分层样本sampsize
并返回这些样本的列均值的函数
get_samples <- function(n, sampsize=4) {
rbindlist(lapply(1:n, function(x) {
splitstackshape::stratified(iris, group="Species",sampsize)[, id:=x]
}))[, lapply(.SD, mean), by=.(Species, id)]
}
y
现在,让我们在这些样本的此类迭代中获得偏差分布
get_bias_distribution <- function(y=100, samples_per_iter=50, size_per_iter=4) {
rbindlist(lapply(1:y, function(y) {
samples = get_samples(samples_per_iter, sampsize=size_per_iter)[, id:=NULL]
samples[, as.list(bias(
estimate=.SD,parameter=c(5,3,2,1),type="relative")*100),
by=.(Species)][, iter:=y]
}))
}
用法(使用默认值)
get_bias_distribution()
输出:
Species Sepal.Length Sepal.Width Petal.Length Petal.Width iter
1: setosa -1.236667 22.61833 -26.70000 -39.69667 1
2: versicolor 46.476667 -11.99500 115.12833 16.82167 1
3: virginica 80.596667 -0.20000 180.21833 53.89000 1
4: setosa -1.513333 20.87000 -27.46167 -38.83667 2
5: versicolor 45.333333 -11.34833 112.84833 17.84500 2
---
296: versicolor 48.250000 -12.26833 113.37000 17.71167 99
297: virginica 77.366667 -2.87000 175.60000 53.07167 99
298: setosa -1.005000 22.67500 -27.02833 -39.69500 100
299: versicolor 47.921667 -10.28333 110.97833 16.86833 100
300: virginica 76.153333 -2.44000 174.46167 52.62167 100
关于上面出了什么问题的一些评论
- 当您调用 时
stratified(iris,group="Species", size=1)
,您将获得一个 3 行 data.table,因为您有效地从三个 Species 中的每一个中随机选择一行
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1: 4.9 3.6 1.4 0.1 setosa
2: 6.3 2.5 4.9 1.5 versicolor
3: 7.7 2.8 6.7 2.0 virginica
- 当您将其包装在 中时
sapply(1:1000, function(x)...)
,您会得到 5 x 1000 列矩阵,其中每列包含 5 个长度为 3 的列表。下面,我将向您展示如果您这样做了会是什么样子sapply(1:6, function(x)...)
[,1] [,2] [,3] [,4] [,5] [,6]
Sepal.Length numeric,3 numeric,3 numeric,3 numeric,3 numeric,3 numeric,3
Sepal.Width numeric,3 numeric,3 numeric,3 numeric,3 numeric,3 numeric,3
Petal.Length numeric,3 numeric,3 numeric,3 numeric,3 numeric,3 numeric,3
Petal.Width numeric,3 numeric,3 numeric,3 numeric,3 numeric,3 numeric,3
Species factor,3 factor,3 factor,3 factor,3 factor,3 factor,3
这并不是你真正想要的,因为你不能lapply
按照你当时的意图来克服这些。相反,您要做的是使用lapply(1:1000, function(x) ...)
创建此类 3 行数据表的列表,然后将它们绑定在一起(在id
为每个数据表添加一列之后)。