将for()循环或apply()用于矩阵中的引导方法

将for()循环或apply()用于矩阵中的引导方法,r,matrix,mean,statistics-bootstrap,R,Matrix,Mean,Statistics Bootstrap,我有下面的矩阵(我们称之为df),我想为每个列创建自举平均值和95%的置信区间,因为权重为0的分布。我希望将平均值和CI作为新行添加到矩阵底部。这是数据的一小部分,真正的数据有>600行,这将使引导更加有效 row.names V183 V184 V185 V186 V187 V188 V189 V190 V191 V192 V193 V194 V195 V196 V197 V198 V199

我有下面的矩阵(我们称之为df),我想为每个列创建自举平均值和95%的置信区间,因为权重为0的分布。我希望将平均值和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

dfsub这是一个有点令人困惑的问题,因为我不确定您是按行还是按列引导,另外还有一些代码不起作用,特别是
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
另请参见
boot.ci
函数了解置信区间,此外,本指南可能对您有用:


一般来说,对于RW中的
循环,应用
/
sapply
等比
快得多。这种解决方案对您的客户有什么问题?这有实质性的不同吗?如果您包含R代码,该代码将复制“df”(如果只是大约),然后仅粘贴所述数据帧的前几行(并删除当前的df输出)。我的错误是,我正在为每个列寻找引导方法。对不起,这是一个打字错误,还有代码中的另一个打字错误。下次我会更加小心的。我已经更新了我的问题。谢谢,Jogal,提供的脚本可以很好地生成引导方法。当我使用您提供的第二个命令(sapply…)时,我收到这个错误消息“error in summary(myBootFun(x))$original:$operator对原子向量无效”,还有什么方法我只能选择某组行,比如1:13行?在我的大数据集中,我在表的底部有一些其他汇总统计数据,公式中也包括了这些自举平均值。我的错误是,它应该是这样的:
sappy(df[,-1],function(x)myBootFun(x)$t0)
——我相应地编辑了答案。此外,您还可以在应用函数的第一项中使用括号索引来选择数据的特定部分,例如,仅选择第1:13行和第2:5列:
sapply(df[,2:5][1:13,],函数(x)myBootFun(x)$t0)
非常好,谢谢Jogal。行和列的选择非常有效。当我运行sapply函数来填充表中的引导值时,出现了这个错误。默认值(d2,na.rm=T):参数不是数字或逻辑的:返回na“听起来你的矩阵中有非数字数据:应用函数输入一个矩阵,作为一个矩阵必须是一种类型,矩阵中有任何字符都会导致所有数值转换为字符。您可以使用括号索引排除包含字符的行或列,或者尝试使用另一个类似apply的函数输入data.frame,例如
colwise()
plyr
库中的
numcolwise()
> 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