[英]Incorporating splitstackshape into loop
我有以下代碼選擇(4 行虹膜 x 1000)*100 並計算每列的偏差。
library(SimDesign)
library(data.table)
do.call(rbind,lapply(1:100, function(x) {
bias(
setDT(copy(iris))[as.vector(sapply(1:1000, function(X) sample(1:nrow(iris),4)))][
, lapply(.SD, mean), by=rep(c(1:1000),4), .SDcols=c(1:4)][,c(2:5)],
parameter=c(5,3,2,1), #parameter is the true population value used to calculate bias
type='relative' #denotes the type of bias being calculated
)
}))
這需要 4 行的 1000 個樣本,通過樣本 # 計算平均值,給我 1000 個平均值。 為每一列找到 1000 均值的偏差,然后再進行 99 次,為我提供每一列的偏差估計分布。 這是在模仿隨機抽樣設計。 但是,我也想為分層設計這樣做。 所以我使用splitstackshape
的stratified
function。
do.call(rbind,lapply(1:100, function(x) {
bias(
setDT(copy(iris))[as.vector(sapply(1:1000, function(X) stratified(iris,group="Species", size=1)))][
, lapply(.SD, mean), by=rep(c(1:1000),4), .SDcols=c(1:4)][,c(2:5)],
parameter=c(5,3,2,1),
type='relative'
)
}))
我原以為這只是換出函數的問題,但我不斷收到錯誤(i is invalid type (matrix)) 。 也許將來一個 2 列矩陣可以返回 DT 的元素列表。 我認為這可能與 setDT 有關,但我不確定如何修復它。 有人知道我哪里出錯了嗎?
我為你分成了幾個功能
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()
Output:
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,因為您實際上是從三個物種中的每一個中隨機選擇一行 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
列之后)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.