簡體   English   中英

將 splitstackshape 合並到循環中

[英]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 次,為我提供每一列的偏差估計分布。 這是在模仿隨機抽樣設計。 但是,我也想為分層設計這樣做。 所以我使用splitstackshapestratified 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 有關,但我不確定如何修復它。 有人知道我哪里出錯了嗎?

我為你分成了幾個功能

加載 data.table、SimDesign 和 splitstackshape

library(SimDesign)
library(data.table)
library(splitstackshape)

Function 獲取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

關於上面出了什么問題的一些評論

  1. 當您調用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
  1. 當您將其包裝在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM