在R

时间:2015-07-21 19:12:26

标签: r parallel-processing statistics-bootstrap

我需要为R中的数据集执行自举。数据采用包含两个矩阵的列表形式,并具有以下属性:

  • 两个矩阵都是n乘m并且只包含正整数(包括0)。

    data <- list(a=matrix(,n,m), b=matrix(,n,m))
    
  • 许多大理石,比如10000,被分配到每个矩阵中,即10000被分成n * m个部分。换句话说,每个矩阵的所有条目的总和是固定的。

    > sum(data$a)
    [1] 10000
    > sum(data$b)
    [1] 10000
    
  • 根据大理石的 ij - 元素的亲和力来分配大理石,即矩阵的 ij 最多有多少大理石取决于概率与矩阵的每个单元相关联。
  • 与元素相关的概率对于两个矩阵是不同的。

我的目标是估计导致潜在概率的参数。我的模型假设2n个参数,n表示行数,每个矩阵一个集合。参数以复杂的方式组合,因此必须一起分析两个矩阵。

    parameters <- data.frame(a=numeric(n), b=numeric(n)) 

现在,这是我正在使用的方法:

  1. 我定义了一个函数SGen,它输入一个包含与所有站点相关的概率的矩阵,使用这些概率生成一个数据集并返回它。

    SGen <- function(freq) {
       #generate sample
       ...
    }
    
  2. 对于非参数自举(我现在想要实现的),我运行一个实验,并通过划分观察到的矩阵计算与每个 ij 元素相关的观测概率10000.我们暂时将其称为freq。因此,freq是一个包含两个矩阵的列表。

    freq <- list(a=data$a/10000, b=data$b/10000)
    
  3. 接下来,我通过将freq传递给SGen来复制100个样本数据。
  4. 我将所有重复项传递给另一个预定义函数analyze,它给出了包含参数的100 n乘2矩阵。
  5. 接下来,我计算所有矩阵之间的条目的平均值和sd,得到包含均值的n×2矩阵和包含sd的另一个矩阵。因此,平均矩阵的第(1,5)个元素的期望值是所有100个重复的第(1,5)个元素的平均值。
  6. 虽然该方法有效,但我想在R中使用启动包来完成这项工作。我想这样做,因为我可以使用启动包中的所有功能进行后续分析,我也喜欢以启动类格式存储基本信息的方式。我想使用启动包的另一个重要原因是它提供了一种简单的方法来利用我的计算机的多核功能。那么,请您指导我如何使用boot作为我的目的?

1 个答案:

答案 0 :(得分:0)

您可以通过以下方式使用bootstrap几乎任何功能(取自?bootstrap):

# To bootstrap functions of more complex data structures, 
# write theta so that its argument x
# is the set of observation numbers  
# and simply  pass as data to bootstrap the vector 1,2,..n. 
# For example, to bootstrap
# the correlation coefficient from a set of 15 data pairs:
xdata <- matrix(rnorm(30),ncol=2)
n <- 15
theta <- function(x,xdata){ cor(xdata[x,1],xdata[x,2]) }
results <- bootstrap(1:n,20,theta,xdata)

theta是引导功能。

这种方法的唯一问题(我相信)是theta只能返回一个向量(不是一次性的多个值的数据帧/矩阵)。因此,如果您的theta函数返回的内容不是向量,则可能无效。

boot包的更新:

使用boot包中的boot函数,方法类似。它需要data,数据作为向量,矩阵或数据帧,statistic,“一个函数,当应用于数据时,返回包含感兴趣的统计量的向量。”对于非参数引导,statistic函数必须(至少)采用两个参数:原始数据,以及索引,频率或权重的向量。

所以,关键是编写一个函数,对索引给出的数据子集实现步骤1-5,例如:

theta <- function(data, indices) {
    ## exact subsetting operation depends on the format of data
    subset_data = data[indices,]
    ## perform the calculations in steps 1-5 here on subset_data
}

然后你应该能够像这样打电话给theta

boot(data, theta)