2

在编写从列联表中采样的函数时,我已经管理了下面的代码 - 与单元格中的频率成正比。

它使用expand.grid然后table返回到原始尺寸表。只要样本量足够大以至于某些类别没有完全丢失,它就可以正常工作。否则,该table命令将返回一个尺寸小于原始表格的表格。

FunSample<- function(Full, n) {
  Frame <- expand.grid(lapply(dim(Full), seq))
  table(Frame[sample(1:nrow(Frame), n, prob = Full, replace = TRUE), ])
}
Full<-array(c(1,2,3,4), dim=c(2,2,2))
FunSample(Full, 100) # OK
FunSample(Full, 1) # not OK, I want it to still have dim=c(2,2,2)!

我的大脑已经停止工作,我知道它必须是一个小调整才能让它回到正轨!?

4

3 回答 3

3

如果您不想table()“删除”缺失的组合,则需要强制 的列Frame成为因子:

FunSample <- function(Full, n) {
  Frame <- as.data.frame( lapply( expand.grid(lapply(dim(Full), seq)), factor) )  
  table( Frame[sample(1:nrow(Frame), n, prob = Full, replace = TRUE), ])
}   

> dim( FunSample(Full, 1))
[1] 2 2 2
> dim( FunSample(Full, 100))
[1] 2 2 2
于 2011-06-16T19:16:37.880 回答
3

交叉表也是多项分布,因此您可以rmultinom在输出中使用和重置维度。这应该会显着提高性能并减少您需要维护的代码。

> X <- rmultinom(1, 500, Full)
> dim(X) <- dim(Full)
> X
, , 1

     [,1] [,2]
[1,]   18   92
[2,]   45   92

, , 2

     [,1] [,2]
[1,]   28   72
[2,]   49  104

> X2 <-rmultinom(1, 4, Full)
> dim(X2) <- dim(Full)
> X2
, , 1

     [,1] [,2]
[1,]    0    1
[2,]    0    0

, , 2

     [,1] [,2]
[1,]    0    1
[2,]    1    1
于 2015-05-19T18:37:16.640 回答
1

您可以使用tabulate代替table; 它适用于整数值向量,就像你在这里一样。您也可以直接使用将输出放入数组中array,就像创建原始数据时一样。

FunSample<- function(Full, n) {
  samp <- sample(1:length(Full), n, prob = Full, replace = TRUE)
  array(tabulate(samp), dim=dim(Full))
}
于 2011-06-16T19:30:27.000 回答