代码之家  ›  专栏  ›  技术社区  ›  Roman LuÅ¡trik

帮助我改进我的引导程序

  •  1
  • Roman LuÅ¡trik  · 技术社区  · 14 年前

    请考虑以下代码:

    require(Hmisc)
    num.boots <- 10
    data <- rchisq(500, df = 5) #generate fake data
    
    #create bins
    binx <- cut(data, breaks = 10)
    binx <- levels(binx)
    binx <- sub("^.*\\,", "", binx)
    binx <- as.numeric(substr(binx, 1, nchar(binx) - 1))
    
    #pre-allocate a matrix to be filled with samples
    output <- matrix(NA, nrow = num.boots, ncol = length(binx)) 
    
    #do random sampling from the vector and calculate percent
    # of values equal or smaller to the bin number (i)
    for (i in 1:num.boots) {
        walk.pair.sample <- sample(data, size = length(data), replace = TRUE)
        data.cut <- cut2(x = walk.pair.sample, cuts = binx)
        data.cut <- table(data.cut)/sum(table(data.cut))
        output[i, ] <- data.cut
    }
    
    #do some plotting
    plot(1:10, seq(0, max(output), length.out = nrow(output)), type = "n", xlab = "", ylab = "")
    
    for (i in 1:nrow(output)) {
        lines(1:10, output[i, 1:nrow(output)])
    }
    
    #mean values by columns
    output.mean <- apply(output, 2, mean)
    lines(output.mean, col="red", lwd = 3)
    legend(x = 8, y = 0.25, legend = "mean", col = "red", lty = "solid", lwd = 3)
    

    我想知道是否可以为boot:boot()函数提供一个长度为n>1的函数作为其输出?有可能吗?

    这是我无力的尝试,但我一定做错了什么。

    require(boot)
    bootstrapDistances <- function(data, binx) {
        data.cut <- cut2(x = data, cuts = binx)
        data.cut <- table(data.cut)/sum(table(data.cut))
        return(data.cut)
    }
    
    > x <- boot(data = data, statistic = bootstrapDistances, R = 100)
    Error in cut.default(x, k2) : 'breaks' are not unique
    

    我真的不明白为什么 Hmisc::cut2() 在中工作不正常 boot() 打电话,但当我打电话给 for() 循环(参见上面的代码)。是我的逻辑 bootstrapDistances() 功能可行 BoT() ?任何提示都非常感谢。

    编辑:。

    aniko建议我这样修改我的函数,包括一个索引。在阅读boot()的文档时,我不清楚它是如何工作的,这解释了为什么函数可能不工作。以下是Aniko建议的新功能:

    bootstrapDistances2 <- function(data, idx, binx) { 
      data.cut <- cut2(x = data[idx], cuts = binx) 
      data.cut <- table(data.cut)/sum(table(data.cut)) 
      return(data.cut) 
    } 
    

    但是,我设法产生了一个错误,我仍在研究如何删除它。

    > x <- boot(data = data, statistic = bootstrapDistances2, R = 100, binx = binx)
    Error in t.star[r, ] <- statistic(data, i[r, ], ...) : 
      number of items to replace is not a multiple of replacement length
    

    重新启动R会话(也尝试了另一个版本2.10.1)后,它似乎工作正常。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Aniko    14 年前

    从帮助文件 boot 功能:

    在所有其他情况下,统计数据必须至少有两个参数。传递的第一个参数始终是原始数据。第二个是定义引导样本的索引、频率或权重的向量。

    所以您需要向 bootstrapDistances 函数,告诉它选择了哪些数据元素:

    bootstrapDistances2 <- function(data, idx, binx) { 
      data.cut <- cut2(x = data[idx], cuts = binx) 
      data.cut <- table(data.cut)/sum(table(data.cut)) 
      return(data.cut) 
    } 
    

    结果是:

    x <- boot(data = data, statistic = bootstrapDistances2, R = 100, binx=binx)
    x
    
    ORDINARY NONPARAMETRIC BOOTSTRAP
    
    
    Call:
    boot(data = data, statistic = bootstrapDistances2, R = 100, binx = binx)
    
    
    Bootstrap Statistics :
         original   bias    std. error
    t1*     0.208  0.00134 0.017342783
    t2*     0.322  0.00062 0.021700803
    t3*     0.190 -0.00034 0.018873433
    t4*     0.136 -0.00116 0.016206197
    t5*     0.078 -0.00120 0.011413265
    t6*     0.036  0.00070 0.008510837
    t7*     0.016  0.00074 0.005816417
    t8*     0.006  0.00024 0.003654581
    t9*     0.000  0.00000 0.000000000
    t10*    0.008 -0.00094 0.003368961
    
        2
  •  0
  •   pteetor    14 年前

    回答得好,阿尼科。

    另外,“boot”的帮助页面指出引导统计函数可能返回一个向量,而不仅仅是一个标量。