【问题标题】:Bootstrapping multiple columns in data.table in a scalable fashion R以可扩展的方式引导 data.table 中的多个列 R
【发布时间】:2016-08-17 06:51:37
【问题描述】:

这是对this one 的后续问题。在最初的问题中,OP 希望在固定的两列 x1x2 上执行引导:

set.seed(1000)
data <- as.data.table(list(x1 = runif(200), x2 = runif(200), group = runif(200)>0.5))
stat <- function(x, i) {x[i, c(m1 = mean(x1), m2 = mean(x2))]}
data[, list(list(boot(.SD, stat, R = 10))), by = group]$V1

但是,我认为这个问题可以很好地扩展到通过将它们视为组来处理任意数量的列。例如,让我们使用iris 数据集。假设我想计算每个物种所有四个维度的引导平均值。我可以使用 melt 来翻转数据,然后使用 Speciesvariable 组合来一次性获得平均值 - 我认为这种方法可以很好地扩展。

data(iris)
iris = data.table(iris)
iris[,mean(Sepal.Length),by=Species]
iris[,ID:=.N,]
iris_deep = melt(iris
                 ,id.vars = c("ID","Species")
                 ,measure.vars = c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width"))
#define a mean bootstrap function
stat <- function(x, i) {x[i, m=mean(value),]}
iris_deep[, list(list(boot(.SD, stat, R = 100))), by = list(Species,variable)]$V1

这是我的尝试。但是,引导部分似乎不起作用。由于 R 抛出以下错误:

Error in mean(value) : object 'value' not found

有人可以解决这个问题吗?

【问题讨论】:

    标签: r data.table statistics-bootstrap


    【解决方案1】:

    我试过这个(用大括号括起来 m=mean(value)),它似乎工作:

    stat <- function(x, i) {x[i, (m=mean(value))]}
    

    【讨论】:

      【解决方案2】:

      我们可以充分利用每个引导程序,并计算每个组内每个变量的平均值,而不是为每个变量重新运行引导程序。

      所以如果我们这样做,它会计算每个变量的平均值:

      iris = data.table(iris)
      iris[sample(nrow(iris),replace=TRUE),lapply(.SD,mean,na.rm=TRUE),by=Species]
      

      因为boot需要向量/矩阵输出,所以我们需要修改上面的输出,并为向量提供名称:

      d = function(dat,ind){
       k = dat[ind,lapply(.SD,mean,na.rm=TRUE),by=Species]
       k_vec = unlist(k[,-1])
       names(k_vec) = paste(rep(colnames(k)[-1],each=nrow(k)),rep(k$Species,(ncol(k)-1)),sep="_")
       k_vec
      }
      
      d(iris,sample(nrow(iris),replace=TRUE))
       Sepal.Length_versicolor  Sepal.Length_virginica     Sepal.Length_setosa 
                    5.8784314               6.4851852               4.9688889 
       Sepal.Width_versicolor   Sepal.Width_virginica      Sepal.Width_setosa 
                    2.7392157               2.9814815               3.3977778 
      Petal.Length_versicolor  Petal.Length_virginica     Petal.Length_setosa 
                    4.1980392               5.5037037               1.4644444 
       Petal.Width_versicolor   Petal.Width_virginica      Petal.Width_setosa 
                    1.2960784               2.0944444               0.2333333
      

      并使用带有strata = iris$Species 的引导来确保对物种进行均匀采样:

      bo_strata = boot(iris,d,R=1000,strata=iris$Species)
      

      我们可以将这种方法的分布与问题中的分布进行比较:

      stat <- function(x, i) {x[i, (m=mean(value))]}
      bo_melt = iris_deep[, list(list(boot(.SD, stat, R = 1000))), by = list(Species,variable)]$V1
      
      par(mfrow=c(4,3))
      par(mar=c(3,3,3,3))
      for(i in 1:ncol(bo_strata$t)){
      plot(density(bo_strata$t[,i]),main=names(bo_strata$t0)[i],col="#43658b")
      lines(density(bo_melt[[i]]$t),col="#ffa372")
      legend("topright",fill=c("#43658b","#ffa372"),c("strata","other"))
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-05
        • 2011-01-10
        • 2019-10-15
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 2018-06-25
        相关资源
        最近更新 更多