重采样/模拟方法:蒙特卡洛,自举,千斤顶,交叉验证,随机化测试和置换测试


73

我试图理解不同重采样方法(蒙特卡罗模拟,参数自举,非参数自举,顶峰,交叉验证,随机化测试和置换测试)之间的区别,以及它们在我自己的环境中使用R的实现。

假设我遇到以下情况–我想对Y变量(Yvar)和X变量(Xvar)执行ANOVA 。Xvar是绝对的。我对以下事情感兴趣:

(1)p值的意义–错误发现率

(2)效果Xvar等级 大小

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
Xvar <- c(rep("A", 5),  rep("B", 5),    rep("C", 5))
mydf <- data.frame (Yvar, Xvar)

您能帮我用明确的工作示例解释采样差异吗,这些重采样方法是如何工作的?

编辑: 这是我的尝试:

Bootstrap 10个Bootstrap样本,样本数量已替换,意味着可以重复样本

boot.samples <- list()
for(i in 1:10) {
   t.xvar <- Xvar[ sample(length(Xvar), length(Xvar), replace=TRUE) ]
   t.yvar <- Yvar[ sample(length(Yvar), length(Yvar), replace=TRUE) ]
   b.df <- data.frame (t.xvar, t.yvar) 
   boot.samples[[i]] <- b.df 
}
str(boot.samples)
 boot.samples[1]

排列: 10个排列样本,样本数量无替换

 permt.samples <- list()
    for(i in 1:10) {
       t.xvar <- Xvar[ sample(length(Xvar), length(Xvar), replace=FALSE) ]
       t.yvar <- Yvar[ sample(length(Yvar), length(Yvar), replace=FALSE) ]
       b.df <- data.frame (t.xvar, t.yvar) 
       permt.samples[[i]] <- b.df 
    }
    str(permt.samples)
    permt.samples[1]

蒙特卡罗模拟

尽管术语“重采样”通常用于表示任何重复的随机或伪随机采样模拟,但是当根据已知的理论分布进行“重采样”时,正确的术语是“蒙特卡洛”模拟。

我不确定上述所有条款以及我的上述修改是否正确。我确实找到了有关折刀的信息,但无法适应我的情况。


3
折刀(Jackknife)是自举程序的更简单的前身。 en.wikipedia.org/wiki/Jackknife_(statistics)
EngrStudent

4
更准确地说:折刀是留一法的重采样[但不用于交叉验证]
cbeleites 2014年

Answers:


121

我们可以找到不同的重采样方法,或简称为“ 模拟 ”方法,这些方法取决于样本的重采样改组。关于适当的术语,意见可能有所不同,但是以下讨论试图归纳和简化适当文献中的可用内容:

重采样方法用于(1)通过使用数据子集(例如Jackknifing)或从一组数据点中进行替换绘制随机样本(例如Bootstrapping )来估计样本统计信息的准确性/准确性(2)在执行重要性时交换数据点上的标签测试(置换测试,也称为精确测试,随机化测试或重新随机化测试)(3)使用随机子集(自举,交叉验证)验证模型(请参阅维基百科:重采样方法

自举

自举是一种统计方法,用于通过从原始样本中进行替换采样来估计估计量的采样分布”。该方法将准确性的度量(根据偏差方差置信区间预测误差或某些其他此类度量定义)分配给样本估计。

自举的基本思想是,可以通过对样本数据进行重采样并对(重采样→样本)进行推断,从而对来自样本数据(样本→种群)的总体推断进行建模。由于总体是未知的,因此样本统计中相对于总体值的真实误差是不可知的。在bootstrap-resamples中,“人口”实际上是样本,并且这是已知的。因此从重采样数据→“真实”样本的推断质量是可测量的。”请参阅Wikipedia

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)

#To generate a single bootstrap sample
sample(Yvar, replace = TRUE) 

 #generate 1000 bootstrap samples
boot <-list()
for (i in 1:1000) 
   boot[[i]] <- sample(Yvar,replace=TRUE)

在单变量问题中,通常可以用替换对各个观察值进行重新采样(“案例重新采样”)。在这里,我们通过替换对数据进行重新采样,并且重新采样的大小必须等于原始数据集的大小。

在回归问题中, 案例重采样是指对单个案例进行重采样的简单方案-回归问题中的数据集通常为行,说明变量通常是固定的,或者至少在响应变量之外具有更多控制权。同样,解释变量的范围定义了可从中获得的信息。因此,对案例进行重采样意味着每个引导样本都会丢失一些信息(请参阅Wikipedia)。因此,合理地对数据行进行采样将是合乎逻辑的Yvar

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
Xvar <- c(rep("A", 5),  rep("B", 5),    rep("C", 5))
mydf <- data.frame (Yvar, Xvar)    

boot.samples <- list()
for(i in 1:10) {
   b.samples.cases <- sample(length(Xvar), length(Xvar), replace=TRUE) 
   b.mydf <- mydf[b.samples.cases,] 
   boot.samples[[i]] <- b.mydf
}
str(boot.samples)
 boot.samples[1]

您会看到一些情况在重复,因为我们正在抽样更换。

参数引导程序 -参数模型通常以最大的可能性拟合到数据,并从该拟合模型中抽取随机数样本。通常,所抽取的样本具有与原始数据相同的样本大小。然后是数量或估计值从这些数据中计算出感兴趣的,该采样过程与其他自举方法一样重复了很多次,在自举方法的采样阶段使用参数模型导致的过程与通过应用基本统计理论获得的过程不同推断相同的模型。”(请参阅Wikipedia)。以下是具有均值和标准差参数的正态分布假设的参数自举。

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)

# parameters for Yvar 
mean.y <- mean(Yvar)
sd.y <- sd(Yvar)

#To generate a single bootstrap sample with assumed normal distribution (mean, sd)
rnorm(length(Yvar), mean.y, sd.y)

 #generate 1000 bootstrap samples
boot <-list()
for (i in 1:1000) 
   boot[[i]] <- rnorm(length(Yvar), mean.y, sd.y)

引导程序还有其他变体,请查阅Wikipedia页面或有关重新采样的任何静态书籍。

杰克尼夫

“通过系统地从数据集中剔除每个观测值并计算估计值,然后找到这些计算结果的平均值,可以找到参数的折刀估计量。给定大小为N的样本,可以通过汇总每个N − 1估计值的估计值来找到折刀估计值在样本中。” 请参阅:Wikipedia下面显示了如何折刀Yvar

jackdf <- list()
jack <- numeric(length(Yvar)-1)

for (i in 1:length (Yvar)){

for (j in 1:length(Yvar)){
     if(j < i){ 
            jack[j] <- Yvar[j]
}  else if(j > i) { 
             jack[j-1] <- Yvar[j]
}
}
jackdf[[i]] <- jack
}
jackdf

“常规的引导程序和折刀,是根据子样本之间统计信息的变异性而不是参数假设来估计统计信息的变异性。对于更常见的折刀,删除-m观测值的折刀,该引导程序可以看作是随机的两者都产生相似的数值结果,这就是为什么每个都可以看作是彼此近似的原因。” 在Bootstrap vs Jacknife中查看此问题

随机化测试

“在参数测试中,我们从一个或多个总体中随机抽样。我们对这些总体做出某些假设,最常见的是它们具有相等的方差正态分布。我们建立了一个以参数表示的零假设,通常为m1形式-m2 = 0。我们使用样本统计量作为相应总体参数的估计,并计算检验统计量(例如在检验时),例如:在学生t检验中,当方差未知但被考虑时均值的差异相等的假设是, H0: m1 = m2另一种假设为:HA: m1 < m2。给定两个从总体1和2抽取的样本,假设它们是具有相等方差的正态分布总体,并且样本是从每个总体中独立随机抽取的,则可以详细说明已知分布的统计量以进行检验H0

避免这些分布假设的一种方法是现在称为非参数统计,等级排序,类排名和无分布统计的方法。通常认为这些无分布统计量比基于假设正态分布的总体的类似测试“效率低”。

另一种替代方法是随机方法 -“独立于观察对象是哪个样本的知识而随机给观察分配等级的过程。随机测试使用这种程序,但是通过对观察而不是联合操作进行操作因此,虽然从理论上可以枚举这样的分布,但不容易将类似统计量的分布(一个样本中的观察值之和)制成表格。”(请参阅参考资料

随机检验在几乎所有方面都与参数检验不同。(1)不需要我们从一个或多个总体中随机抽取样本-实际上,我们通常没有随机抽样。(2)我们很少考虑数据的来源群体,因此无需假设正态性或同态性。(3)我们的零假设与参数无关,但措辞含糊,因为,例如,关于治疗对参与者的表现没有影响的假设。(4)因为我们不关心人口,所以我们不关心估计(甚至检验)这些人口的特征(5)我们确实计算了一些某种测试统计量,但是我们不将该统计量与表格分布进行比较。代替,我们将它与当我们在组中重复随机化数据时获得的结果进行比较,并为每个随机化计算相应的统计量。(6)随机化测试比参数化测试更重要,它强调了参与者随机分配治疗的重要性。”

非常流行的随机测试类型是置换测试。如果我们的样本大小为12和5,则总排列可能为C(12,5) = 792。如果我们的样本量分别为10和15,则可能有320万以上的安排。这是计算方面的挑战:那又如何? 样品。当可能的排列的范围太大而无法枚举时,为什么不独立地,随机地从该范围取样排列呢?然后可以将检验统计量在这一系列样本中的分布制成表格,计算其均值和方差,并估算与假设检验相关的错误率。

置换测试

根据Wikipedia的说法,“置换检验(也称为随机检验重新随机检验精确检验)是一种统计显着性检验,其中零假设下的检验统计量的分布是通过计算所有可能的值来获得的下的检验统计量的标签的重排对所观察到的数据点。对于任何测试统计量存在置换检验,而不管其分布是否是已知的。因此,一个总是自由选择的统计,其假设和替代和之间最好判别从而使损失最小化。”

置换和引导程序之间的区别在于,引导程序样本需要替换,而置换样本不需要替换。无论哪种情况,观测的时间顺序都会丢失,因此会丢失波动率聚类,从而确保样本处于无波动率聚类的零假设之下。

排列始终具有所有相同的观察值,因此它们更像是原始数据,而不是自举样本。期望置换测试应该比自举测试更敏感。排列破坏了波动性聚类,但没有添加任何其他可变性

请参阅有关置换与自举的问题 -“置换测试最适合于检验假设,自举最适合于估计置信区间 ”。

因此,在这种情况下要执行置换,我们只需更改replace = FALSE上面的引导示例即可。

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
     #generate 1000 bootstrap samples
       permutes <-list()
    for (i in 1:1000) 
       permutes[[i]] <- sample(Yvar,replace=FALSE)

如果有多个变量,只需选择行并重新排列顺序就不会有任何区别,因为数据将保持不变。因此,我们重新调整y变量。您已经做过的事情,但是我认为我们并不需要像和一样对两者和进行两次改组xy variables

Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
Xvar <- c(rep("A", 5),  rep("B", 5),    rep("C", 5))
mydf <- data.frame (Yvar, Xvar)

 permt.samples <- list()
    for(i in 1:10) {
       t.yvar <- Yvar[ sample(length(Yvar), length(Yvar), replace=FALSE) ]
       b.df <- data.frame (Xvar, t.yvar) 
       permt.samples[[i]] <- b.df 
    }
    str(permt.samples)
    permt.samples[1]

蒙特卡洛方法

“蒙特卡洛方法(或蒙特卡洛实验)是一类广泛的计算算法,它们依赖于重复随机采样来获得数值结果;通常,为了获得未知概率实体的分布,需要多次运行模拟。从技术的相似性到在真正的赌博娱乐场中播放和记录结果的行为。”参见Wikipedia

“在应用统计中,蒙特卡洛方法通常用于两个目的:

(1)比较现实数据条件下小样本的竞争统计数据。尽管可以针对渐近条件(即无限大的样本量和无限小的处理效果)从经典理论分布(例如正态曲线,柯西分布)得出的数据计算出I类误差和统计的幂属性,但实际数据通常可以没有这样的分布。

(2)提供假设检验的实现,该检验比诸如置换检验(通常无法计算)之类的精确检验更有效,同时比渐近分布的临界值更准确。

蒙特卡洛方法也是近似随机化和置换检验之间折衷。一个近似随机化试验是基于所有排列的指定子集(其需要潜在的巨大持家其中置换已被考虑)。蒙特卡洛方法基于指定数量的随机绘制的排列如果排列绘制两次(或更频繁),则交换精度会稍有损失,因为不必跟踪已经选择了哪些排列)。”

MC和置换测试有时统称为随机测试。所不同的是在MC我们采样置换样品,而使用所有可能的组合

交叉验证

交叉验证之外的想法是,应使用未用于拟合模型的数据来测试模型。交叉验证也许是最常用于预测的情况

“交叉验证是一种用于验证预测模型的统计方法。保留数据的子集以用作验证集;模型适合其余数据(训练集),并用于预测验证集。平均验证集之间的预测质量可产生对预测准确性的整体衡量。

一种形式的交叉验证可以一次忽略一个观察结果。这类似于折刀。另一种是K折交叉验证,可将数据分成K个子集。每个依次为验证组举行了。”看到维基百科,交叉验证通常是用量化的数据来完成。你可以把你定性(系数数据),以某种方式定量,以适应线性模型和测试这种模式。以下是简单保留策略,其中50%的数据用于模型预测,而其余的数据用于测试,假设Xvar也是定量变量。

    Yvar <- c(8,9,10,13,12, 14,18,12,8,9,   1,3,2,3,4)
    Xvar <- c(rep(1, 5),  rep(2, 5),    rep(3, 5))
    mydf <- data.frame (Yvar, Xvar)
    training.id <- sample(1:nrow(mydf), round(nrow(mydf)/2,0), replace = FALSE)
    test.id <- setdiff(1:nrow(mydf), training.id)
   # training dataset 
    mydf.train <- mydf[training.id]

    #testing dataset 
    mydf.test <- mydf[test.id]

与自举和置换测试不同,用于训练和测试的交叉验证数据集是不同的。下图显示了使用不同方法进行重采样的摘要。

在此处输入图片说明

希望这个对你有帮助。


23
这是令人印象深刻的-特别是,因为这是您的第一个答案!希望您继续参与这里,并希望您将来对我们的网站有所贡献。
Whuber

这个答案真是个大图景。但是,某些链接似乎已被放弃。有人知道链接在哪里吗?
tintinthong '16

6

这是我的贡献。

数据

Yvar <- c(8,9,10,13,12,
          14,18,12,8,9,
          1,3,2,3,4)
Xvar <- rep(LETTERS[1:3], each=5)
mydf <- data.frame(Yvar, Xvar)

蒙特卡洛

我将蒙特卡洛视为获取(结果)随机变量分布的一种方法,这是其他(输入)随机变量的非平凡函数的结果。我不会立即看到与当前的方差分析之间存在重叠,可能其他论坛成员可以在此处提供意见。

自举

目的是了解从观察到的样本计算出的统计数据的不确定性。例如:我们可以计算出Yvar 的样本均值为8.4,但是我们如何确定Yvar 的总体均值呢?诀窍是要像样本是总体一样进行操作,并从该假总体中进行多次采样。

n <- 1000
bootstrap_means <- numeric(length=n)
for(i in 1:n){
   bootstrap_sample <- sample(x=Yvar, size=length(Yvar), replace=TRUE)
   bootstrap_means[i] <- mean(bootstrap_sample)
}
hist(bootstrap_means)

我们只是取样而未假设任何参数分布。这是非参数引导程序。例如,如果您愿意假设Xvar是正态分布,则还可以rnorm(...)使用估计的均值和标准差从正态分布()进行采样,这就是参数bootstrap

其他用户也许会根据Xvar级别的效果大小来提供引导程序的应用程序?

折刀

折刀似乎有点过时了。仅出于完整性考虑,您可以或多或少地将其与引导程序进行比较,但是此处的策略是查看如果我们忽略一个观察结果(并对每个观察重复此操作)会发生什么情况。

交叉验证

在交叉验证中,您将(通常是很大的)数据集分为一个训练集和一个验证集,以查看估计的模型能够多么有效地预测验证集中的值。我个人还没有看到将交叉验证应用于ANOVA,因此我更愿意将这一部分留给其他人使用。

随机/排列检验

警告,术语未达成共识。请参阅随机化测试和置换测试之间的区别

零假设是A,B和C组的总体之间没有差异,因此,如果我们随机交换Xvar的15个值的标签,则没有关系。如果最初观察到的F值(或其他统计数据)与随机交换标签后获得的F值不一致,则可能确实很重要,并且可以拒绝零假设。

observed_F_value <- anova(lm(Yvar ~ Xvar))$"F value"[1]

n <- 10000
permutation_F_values <- numeric(length=n)

for(i in 1:n){
   # note: the sample function without extra parameters defaults to a permutation
   temp_fit <- anova(lm(Yvar ~ sample(Xvar)))
   permutation_F_values[i] <- temp_fit$"F value"[1]
}

hist(permutation_F_values, xlim=range(c(observed_F_value, permutation_F_values)))
abline(v=observed_F_value, lwd=3, col="red")
cat("P value: ", sum(permutation_F_values >= observed_F_value), "/", n, "\n", sep="")

直方图

但是,在复杂设计的情况下,请谨慎对待重新分配标签的方式。还要注意,在方差不相等的情况下,可交换性的零假设首先就不成立,因此这种置换检验将是不正确的。

在这里,我们没有明确遍历标签的所有可能排列,这是P值的蒙特卡洛估计。对于小型数据集,您可以进行所有可能的排列,但是上面的R代码更容易理解。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.