簡體   English   中英

以可擴展的方式在 data.table 中引導多列 R

[英]Bootstrapping multiple columns in data.table in a scalable fashion R

這是一個跟進問題一個。 在最初的問題中,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數據集。 假設我想計算每個物種所有四個維度的 bootstrap 平均值。 我可以使用 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

有人可以嘗試一下嗎?

我試過這個(加上括號括起來m=mean(value) ),它似乎工作:

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

我們可以充分利用每個引導程序,並計算每個組內每個變量的平均值,而不是為每個變量重新運行引導程序。

所以如果我們做這樣的事情,它會計算每個變量的平均值:

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 boot 來確保對 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"))
}

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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