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

Take one sample per row at a time, compute mean, loop

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

这就是我想做的事情:

  1. 对于每一行,抽取一个随机值,直到所有 47 行都被抽取一次。只能对数值进行采样(应忽略 NA)。
  2. 取这 47 个值,计算平均值并存储平均值。
  3. 重复此过程 10,000 次并进行替换。
  4. 确定这10000个均值的95%区间(2.5%-97.5%)。
  5. 绘制 10,000 均值的直方图,显示 2.5% 和 97.5% 区间的边界。
  6. 确定观测值是落在边界内还是边界外。
  7. 计算观察到的平均值的 P 值。

重要的是,每行(随机)只抽取一个样本,并且在每次迭代中对每一行进行一次抽样。

我希望我没有要求太多:-) 感谢您的帮助!

首先让我们制作 so 数据进行实验

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

现在我们可以计算均值了。 apply 函数从每一行中抽取一个随机值(!is.na 排除 NA 值),mean 获取平均值,然后 replicate 重复此 10000 次。

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")

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

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