使用for()循环或apply()来引导矩阵表示

时间:2014-07-07 13:07:15

标签: r matrix boot mean

我有以下矩阵(我们称之为df),由于加权分布很大,我想为每个列创建自举均值和95%置信区间。我希望将均值和CI作为新行添加到矩阵的底部。这是数据的一小部分,真实数据有> 600行,这将使自举更加有效。

row.names   V183    V184    V185    V186    V187    V188    V189    V190    V191    V192    V193    V194    V195    V196    V197    V198    V199    V200    V201    V202    V203    V204    V205
1   0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  NA  NA
2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
3   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0.022   0   NA  NA  NA  NA  NA  NA
4   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308  0.07692308
5   0   0   0   0   0.066   0.066   0.066   0.066   0.066   0.066   0.066   0.066   0.066   0.066   0   0   0   0   0   0   0   0   0
6   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0.077   0   0   0   0
7   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
8   0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0.07142857  0   0   0   0   0   0   0   0   0   0   0   0
9   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   NA  NA  NA  NA  NA  NA
10  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
11  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806  0.03225806
12  0   0   0   0   0   0   0   0   0   0   0   0   0   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
13  0   0   0   0   0   0   0   0   0   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
14  0   0   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0.033   0   0   0   0   0   0

我已成功为单个列创建自举值,但尚未成功创建一个for()循环,该循环将填充矩阵的整行自举值

以下是我的单行代码。

dfsub<-df[,1]
mean.boot <- function(dfsub, d) {
E=dfsub[d,]
return(mean(E, na.rm=T))}
b = boot(dfsub, mean.boot, R=1000)
b

有什么想法? for循环或应用fn会更好吗?

此外,引导值的输出给出了原始值和偏差,但是实际引导的平均值在哪里?

1 个答案:

答案 0 :(得分:2)

这是一个有点令人困惑的问题,因为我不确定你是按行还是按列引导,还有一些代码不起作用,特别是E=dfsubd,]。但是如果你想为每一列提供自举方法,那么一个简单的apply应该可以正常工作,如下所示:

> myMeanFun <- function(d, i) {
    d2 <- d[i]
    return(mean(d2, na.rm=T))
}

> myBootFun <- function(d) {
    boot(d, myMeanFun, R = 1000)
}

> lapply(df[,-1], function(x) myBootFun(x) )

$V183

ORDINARY NONPARAMETRIC BOOTSTRAP


Call:
boot(data = d, statistic = myMeanFun, R = 1000)


Bootstrap Statistics :
     original       bias    std. error
t1* 0.0186044 0.0004565272 0.008418108

$V184

ORDINARY NONPARAMETRIC BOOTSTRAP


Call:
boot(data = d, statistic = myMeanFun, R = 1000)


Bootstrap Statistics :
     original       bias    std. error
t1* 0.0186044 3.504457e-05 0.008293219

你可以使用这样的东西来访问特定的统计数据(这里是自助平均值):

> sapply(df[,-1], function(x) myBootFun(x)$t0 )

      V183       V184       V185       V186       V187       V188       V189 
0.01860440 0.01860440 0.02114286 0.02114286 0.02621978 0.02621978 0.02621978 
      V190       V191       V192       V193       V194       V195       V196 
0.02621978 0.02664243 0.02886264 0.02886264 0.02291026 0.02362932 0.02559843 
      V197       V198       V199       V200       V201       V202       V203 
0.02009843 0.02650869 0.02467535 0.02631042 0.02631042 0.01861042 0.01861042 
      V204       V205 
0.01213124 0.01213124 

另请参阅boot.ci函数的置信区间,此外指南可能对您有用:

http://www.ats.ucla.edu/stat/r/faq/boot.htm