每次一行取一个样本,计算均值,循环

时间:2016-11-02 23:36:36

标签: r loops lapply statistics-bootstrap

在R中,我有一个47行和30列的矩阵。每个单元格包含一个数值(从0.0到1.0不等)。有些细胞有" NA"而不是数值。

这就是我想做的事情:

  1. 对于每一行,采样一个随机值,直到所有47行都被采样一次。只能采样数值(NA应该被忽略)。
  2. 取这47个值,计算均值,然后存储均值。
  3. 重复此过程10,000次。
  4. 确定这10,000个手段的95%间隔(2.5%-97.5%)。
  5. 绘制10,000个直方图,表示边界为2.5%和97.5%。
  6. 确定观察值是否落在边界内部或外部。
  7. 计算观察到的平均值的P值。
  8. 非常重要的是,每行(随机)只抽取一个样本,并且每次迭代都会对每一行进行一次采样。

    我希望我不要求太多:-) 我感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

首先让数据进行试验

set.seed(100)
example <- matrix(runif(47*30), nrow = 47)
example[sample(length(example), 250)] <- NA

现在我们可以计算出手段。 apply函数会对每行中的随机值进行采样(!is.na排除NA值),mean获取均值,replicate重复此次10000次。< / p>

exmeans <- replicate(10000, mean(apply(example, 1, 
                                 function(x) sample(x[!is.na(x)], 1))))

置信区间可以通过两种不同的方式计算。第一个使用示例均值作为经验分布并从中计算均值,第二个使用正态分布来计算概率。

confint <- quantile(exmeans, c(0.025, 0.975))
confint <- qnorm(c(0.025, 0.975), mean = mean(exmeans), sd = sd(exmeans))

接下来你想要的地块

hist(exmeans)
abline(v = confint, col = "red")

histogram of quantiles

最后是p值信息。我们再一次可以使用经验分布或正态分布。这些为分布的下尾提供p值,对上尾使用1 - result

newvalue > confint[1] & newvalue < confint[2]
ecdf(exmeans)(newvalue)
pnorm(newvalue, mean = mean(exmeans), sd = sd(exmeans))