在最终估算中使用“Inf”的Bootstrap置信区间 - boot / dplyr包

时间:2016-07-08 17:56:35

标签: r dplyr bootstrapping infinite confidence-interval

我正在尝试从拟合模型中引导一个值(曲线的最大斜率)。虽然我认为代码可能更有效,但我认为它通常有效(关于如何提高效率的建议也会受到欢迎)。我遇到的问题是,当我得到最终样本值时,其中一个单元格中有Inf会阻止我获得置信区间。我不确定这是一个引导问题还是我编写它的方式很简单。示例代码:

 library(boot)
 library(dplyr)
 df <- data.frame (id=rep(1:10,each=10),
                      time1=rep(1:10,10),
                      ff=runif(100, 100, 150),
                      gg=runif(100, 120, 170))



    set.seed(10)

#function
    maxx<-function(formula, data,varr,indices)  {
      data <- data[indices,] # allows boot to select sample 
      fit <- lm(formula, data=data)
      data$fit<-fit$fitted.values
      data<-filter(data,time1>5)
      data1<-data %>% group_by_(varr) %>% mutate(derivative = c(NA,diff(fit) / diff(time1))) %>%
        group_by(id) %>%
        slice(which.max(derivative)) %>%
        ungroup()  %>%
        as.data.frame()
      return(mean(data1$derivative,na.rm = TRUE))
    }

 res <- boot(data=df, statistic=maxx, 
                    R=10, formula=ff~gg,varr="id")

这可行但由于其中一个单元格中的Inf而无法获得SE

R>res

ORDINARY NONPARAMETRIC BOOTSTRAP


Call:
boot(data = df, statistic = maxx, R = 10, formula = ff ~ gg, 
    varr = "id")


Bootstrap Statistics :
     original  bias    std. error
t1* 0.1726803     Inf         NaN
        res
        res$t 

我们可以通过进一步探索来看到这一点:

R>res$t
            [,1]
 [1,] 0.50399242
 [2,] 0.52171509
 [3,] 0.04568459
 [4,] 1.41317481
 [5,] 0.39741115
 [6,] 0.10703703
 [7,] 0.52206909
 [8,] 0.91624253
 [9,]        Inf
[10,] 0.05076168


R>boot.ci(res, type="normal")
Error in ci.out[[4L]] : subscript out of bounds

也许我错过了一些内容,但我认为return(mean(data1$derivative,na.rm = TRUE))会解决NA的任何问题。有人有什么建议吗?我猜这是一个小修复。这是我第一次运行bootstrap,如果我正在做一些天真的事情,那么道歉。如果有人知道如何使整体代码更高效,那将是很好的,因为我运行的是大型随机效果模型,而不是简单的模型。感谢

1 个答案:

答案 0 :(得分:1)

由于boot重新取样,您可能会在给定样本中获得给定 id time1 的重复值。发生这种情况时,您的导数计算diff(fit)/diff(time)的计算结果为0/0,该值应返回NaN。对于maxx函数的其余部分,NaN值本身不应该存在问题(虽然我不清楚你要做什么),但我怀疑由于浮点不准确diff(fit)有时返回非零值,除以零以生成Inf或-Inf。 which.maxmean函数不会忽略Inf,因此您的maxx函数偶尔会返回Inf。