将for()循环或apply()用于矩阵中的引导方法
我有下面的矩阵(我们称之为df),我想为每个列创建自举平均值和95%的置信区间,因为权重为0的分布。我希望将平均值和CI作为新行添加到矩阵底部。这是数据的一小部分,真正的数据有>600行,这将使引导更加有效将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
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