4

我想引导一个包含组的数据集。一个简单的场景是引导简单的方法:

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)), by = "group"]}
boot(data, stat, R = 10)

incorrect number of subscripts on matrix由于部分原因,这给了我错误by = "group"。我设法使用子集来解决它,但不喜欢这个解决方案。有没有更简单的方法来完成这种任务?

特别是,我想在统计函数中引入一个额外的参数,stat(x, i, groupvar)并将其传递给引导函数,如boot(data, stat(groupvar = group), R = 100)

4

3 回答 3

3

使用

 boot       * 1.3-18  2016-02-23 CRAN (R 3.2.3)                        
 data.table * 1.9.7   2015-10-05 Github (Rdatatable/data.table@d607425)

我使用 OP 的代码和@eddi 提供的答案收到错误:

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)), by = "group"]}
data[, list(list(boot(.SD, stat, R = 10))), by = group]$V1

产生错误消息:

Error in eval(expr, envir, enclos) : object 'group' not found 

by=group通过从函数中删除来修复错误stat

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

这会产生以下引导统计结果:

[[1]]

ORDINARY NONPARAMETRIC BOOTSTRAP


Call:
boot(data = .SD, statistic = stat, R = 10)


Bootstrap Statistics :
     original       bias    std. error
t1* 0.5158232  0.004930451  0.01576641
t2* 0.5240713 -0.001851889  0.02851483

[[2]]

ORDINARY NONPARAMETRIC BOOTSTRAP


Call:
boot(data = .SD, statistic = stat, R = 10)


Bootstrap Statistics :
     original        bias    std. error
t1* 0.5142383 -0.0072475030  0.02568692
t2* 0.5291694 -0.0001509404  0.02378447

下面,我修改示例数据集以突出显示哪个 Bootstrap Statistic 与哪个组列组合一起使用:

考虑第 1 组,x1 的平均值为 10,x2 的平均值为 10000,第 2 组的平均值为 x1 的 2000,x2 的平均值为 8000:

data2 <- as.data.table(list(x1 = c(runif(100, 9,11),runif(100, 1999,2001)), x2 = c(runif(100, 9999,10001),runif(100, 7999,8001)), group = rep(c(1,2), each=100)))
stat <- function(x, i) {x[i, c(m1 = mean(x1), m2 = mean(x2))]}
data2[, list(list(boot(.SD, stat, R = 10))), by = group]$V1

这使:

[[1]]

ORDINARY NONPARAMETRIC BOOTSTRAP


Call:
boot(data = .SD, statistic = stat, R = 10)


Bootstrap Statistics :
      original       bias    std. error
t1*   10.00907  0.007115938  0.04349184
t2* 9999.90176 -0.019569568  0.06160653

[[2]]

ORDINARY NONPARAMETRIC BOOTSTRAP


Call:
boot(data = .SD, statistic = stat, R = 10)


Bootstrap Statistics :
    original       bias    std. error
t1* 1999.965  0.031694179  0.06561209
t2* 8000.110 -0.006569872  0.03992401
于 2016-04-20T00:38:35.683 回答
2

这应该这样做:

data[, list(list(boot(.SD, stat, R = 10))), by = group]$V1
于 2013-09-20T14:03:13.377 回答
1

在您进入按组部分之前,您的代码中存在很多问题。

你的意思是这样的吗?

data <- as.data.frame(list(x1 = runif(200), x2 = runif(200), group = factor(sample(letters[1:2]))))
stat <- function(x, i)  c(m1 = mean(x$x1[i]), m2 = mean(x$x2[i]))

> stat(x,1:10)
       m1        m2 
0.4465738 0.5522221 

然后从那里你可以担心无论你选择如何按组进行

例如:

library(plyr)
dlply( data, .(group), function( dat ) boot(dat, stat, R=10) )

对于更大的数据集,请尝试data.table

by( seq(nrow(data)), data$group, function(idx) myboot(data[idx,]))

我选择了by()而不是data.table',by=参数,因为您希望输出是一个列表。可能有一些我不知道的功能,但我找不到它(请参阅编辑历史以了解它导致的问题)。

子集化仍然是通过data.table's[]方法完成的,所以它应该很快。

于 2013-09-20T11:00:13.197 回答