diff --git a/docs/10.md b/docs/10.md index 9619f7840e612f7570a19886cc794766ccef2bf5..03712169b1cd449c76f9b5709107a38b2828212d 100644 --- a/docs/10.md +++ b/docs/10.md @@ -2,4 +2,396 @@ 在前一章中,我们讨论了如何使用数据来测试假设。这些方法提供了一个二元答案:我们要么拒绝要么不拒绝无效假设。然而,这种决定忽略了一些重要的问题。首先,我们想知道我们对答案的不确定性有多大(不管它是如何发展的)。此外,有时我们没有一个明确的空假设,所以我们想看看什么范围的估计与数据一致。第二,我们想知道实际效果有多大,因为正如我们在前一章的减肥例子中看到的,统计显著的效果并不一定是一个实际重要的效果。 -在这一章中,我们将讨论解决这两个问题的方法:置信区间提供对我们估计的不确定性的度量,以及影响大小提供一种标准化的方法来理解影响有多大。我们还将讨论 _ 统计能力 _ 的概念,它告诉我们,我们可以多么好地期望找到任何可能存在的真正效果。 \ No newline at end of file +在这一章中,我们将讨论解决这两个问题的方法:置信区间提供对我们估计的不确定性的度量,以及影响大小提供一种标准化的方法来理解影响有多大。我们还将讨论 _ 统计能力 _ 的概念,它告诉我们,我们可以多么好地期望找到任何可能存在的真正效果。 + +## 10.1 置信区间 + +到目前为止,我们在这本书中的重点是估计统计数据的具体值。例如,假设我们想估计 nhanes 数据集中成年人的平均体重。我们可以从数据集中提取一个样本并估计平均值: + +```r +# take a sample from adults in NHANES and summarize their weight + +sampSize <- 250 +NHANES_sample <- sample_n(NHANES_adult, sampSize) + +sample_summary <- + NHANES_sample %>% + summarize( + meanWeight = mean(Weight), + sdWeight = sd(Weight) + ) +pander(sample_summary) +``` + + +| 平均重量 | S 重量 | +| --- | --- | +| 82.77 美元 | 22.27 条 | + +在这个样本中,平均重量是 82.77 千克。我们将其称为 _ 点估计 _,因为它为我们提供了一个描述差异的单一数字。然而,我们从前面对抽样误差的讨论中知道,这个估计有一些不确定性,用标准误差来描述。您还应该记住,标准误差由两个部分决定:总体标准偏差(分子)和样本大小的平方根(分母)。总体标准偏差是一个未知但固定的参数,不在我们的控制范围内,而样本量 _ 在我们的控制范围内。因此,我们可以通过增加样本量来降低估计的不确定性——达到整个群体规模的极限,此时完全没有不确定性,因为我们可以直接从整个群体的数据中计算群体参数。_ + +您可能还记得之前我们引入了 _ 置信区间 _ 的概念,这是一种描述统计估计不确定性的方法。请记住,置信区间描述了一个平均包含给定概率的真实总体参数的区间;例如,95%置信区间是一个将捕获 95%时间的真实总体参数的区间。请再次注意,这不是关于填充参数的语句;任何特定的置信区间都包含或不包含真参数。正如信任区间的发明者 Jerzy Neyman 所说: + +> “参数是一个未知常数,不能对其值作出概率陈述。”(J Neyman 1937) + +平均值的置信区间计算如下: + +![](img/1802bb15357660c8509890bd23bf9464.jpg) + +其中临界值由估计值的抽样分布确定。那么,重要的问题是抽样分布是什么。 + +# + +## 10.1.1 使用正态分布的置信区间 + +如果我们知道总体标准差,那么我们可以用正态分布来计算置信区间。我们通常不这样做,但对于我们的 nhanes 数据集示例,我们这样做(重量为 21.3)。 + +假设我们要计算平均值的 95%置信区间。临界值将是标准正态分布的值,它捕获了 95%的分布;这些仅仅是分布的 2.5%和 97.5%,我们可以使用 r 中的`qnorm()`函数计算得出![](img/62de2e04c50cdadabb13e0e5fa449b90.jpg)。因此,平均值(![](img/17ee279e0e3562706ec890e1da87b839.jpg))的置信区间为: + +![](img/593ce3f65adac443076014a8b5668e9b.jpg) + +利用样本(82.77)的估计平均值和已知的总体标准差,我们可以计算出[80.13,85.41]的置信区间。 + +# + +## 10.1.2 使用 t 分布的置信区间 + +如上所述,如果我们知道总体标准差,那么我们可以使用正态分布来计算我们的置信区间。但是,一般情况下,我们不会——在这种情况下,_t_ 分布更适合作为采样分布。记住,t 分布比正态分布略宽,特别是对于较小的样本,这意味着置信区间将比我们使用正态分布时的置信区间略宽。这包含了当我们基于小样本得出结论时产生的额外不确定性。 + +我们可以用类似于上述正态分布的方法计算 95%的置信区间,但临界值是由 _t_ 分布的 2.5%和 97.5%确定的,我们可以用 r 中的`qt()`函数计算,因此平均值(![](img/17ee279e0e3562706ec890e1da87b839.jpg))的 ence 间隔为: + +![](img/2ba466ac95c37a91093b33efe3a8c843.jpg) + +其中![](img/998149a807724e0687217b52f2785a85.jpg)是临界 t 值。对于 nhanes 权重示例(样本大小为 250),置信区间为: + +```r +# compute confidence intervals for weight in NHANES data + +sample_summary <- + sample_summary %>% + mutate( + cutoff_lower = qt(0.025, sampSize), + cutoff_upper = qt(0.975, sampSize), + CI_lower = meanWeight + cutoff_lower * sdWeight / sqrt(sampSize), + CI_upper = meanWeight + cutoff_upper * sdWeight / sqrt(sampSize) + ) +pander(sample_summary) +``` + + +| meanWeight | sdWeight | 切断阀 | 上切断 | Ci_ 下 | Ci_ 上部 | +| --- | --- | --- | --- | --- | --- | +| 82.77 | 22.27 | -1.97 条 | 1.97 条 | 80 | 85.54 美元 | + +请记住,这并不能告诉我们关于真实总体值在这个区间内的概率,因为它是一个固定参数(我们知道它是 81.77,因为在这种情况下我们有整个总体),并且它或者不在这个特定区间内(i 在这种情况下,确实如此)。相反,它告诉我们,从长远来看,如果我们使用这个过程计算置信区间,95%的置信区间将捕获真正的总体参数。 + +# + +## 10.1.3 置信区间和样本量 + +由于标准误差随样本量的减小而减小,平均置信区间应随着样本量的增大而变窄,从而为我们的估计提供了越来越严格的界限。图[10.1](#fig:CISampSize)显示了置信区间将如何作为权重示例的样本大小函数而变化的示例。从图中可以明显看出,随着样本量的增加,置信区间变得越来越紧,但是增加样本会产生递减的回报,这与置信区间项的分母与样本量的平方根成正比的事实相一致。E. + +![An example of the effect of sample size on the width of the confidence interval for the mean.](img/file63.png) + +图 10.1 样本量对平均值置信区间宽度影响的示例。 + +# + +## 10.1.4 使用引导程序计算置信区间 + +在某些情况下,我们不能假定正态性,或者我们不知道统计的抽样分布。在这些情况下,我们可以使用引导程序(我们在[8](#resampling-and-simulation)章中介绍了它)。作为提醒,引导程序需要重复地用替换项对数据 _ 进行重采样,然后使用这些样本上计算的统计分布作为统计分布的抽样代理。_ + +早些时候,我们使用手工编写的代码运行引导程序,但是 R 包含一个名为`boot`的包,我们可以使用它运行引导程序并计算置信区间。让我们用它来计算 nhanes 样本中权重的置信区间。 + +```r +# compute bootstrap confidence intervals on NHANES weight data + +meanWeight <- function(df, foo) { + return(mean(df[foo, ]$Weight)) +} + +bs <- boot(NHANES_sample, meanWeight, 1000) + +# use the percentile bootstrap +bootci <- boot.ci(bs, type = "perc") +print("Bootstrap confidence intervals:") +``` + +```r +## [1] "Bootstrap confidence intervals:" +``` + +```r +tibble( + lower = bootci$perc[4], + upper = bootci$perc[5] +) %>% + pander() +``` + + +| 降低 | 上面的 | +| --- | --- | +| 第 80.12 条 | 85.71 美元 | + +这些值与使用上面的 t 分布得到的值相当接近,尽管不完全相同。 + +# + +## 10.1.5 置信区间与假设检验的关系 + +置信区间与假设检验有着密切的关系。尤其是,如果置信区间不包括无效假设,那么相关的统计检验将具有统计学意义。例如,如果您使用![](img/6bdc138de1860434ee85d22ac40f9ae8.jpg)测试样本的平均值是否大于零,您可以简单地检查是否在平均值的 95%置信区间内包含零。 + +如果我们想比较两个条件的平均值,事情会变得更棘手(Schenker 和绅士 2001)。有几个情况是清楚的。首先,如果每个均值都包含在另一个均值的置信区间内,那么在所选置信水平上肯定没有显著差异。其次,如果置信区间之间没有重叠,那么在所选水平上肯定存在显著差异;事实上,该测试基本上是 _ 保守 _,因此实际误差率将低于所选水平。但是,如果置信区间彼此重叠,但不包含另一组的平均值,情况会怎样呢?在这种情况下,答案取决于两个变量的相对可变性,没有一般的答案。一般来说,我们应该避免对重叠的置信区间使用“视觉测试”,因为它通常会导致较高的假阴性(II 型)错误率。 + +## 10.2 效果大小 + +> “统计显著性是最不有趣的结果。你应该用数量尺度来描述结果——不仅仅是治疗对人有影响,还有它对人有多大的影响。”基因玻璃(Ref) + +在最后一章中,我们讨论了统计学意义不一定反映实际意义的观点。为了讨论实际意义,我们需要一种标准的方法来根据实际数据描述效应的大小,我们称之为 _ 效应大小 _。在本节中,我们将介绍这个概念,并讨论计算影响大小的各种方法。 + +效应大小是一种标准化的测量,它将某些统计效应的大小与参考量(如统计的可变性)进行比较。在一些科学和工程领域中,这个概念被称为“信噪比”。有许多不同的方法可以量化效果大小,这取决于数据的性质。 + +# + +## 10.2.1 科恩 + +影响大小最常见的度量之一是以统计学家雅各布·科恩(Jacob Cohen)的名字命名的 _ 科恩的 D_,他在 1994 年发表的题为“地球是圆的(P<;.05)”的论文中最为著名。它用于量化两种方法之间的差异,根据它们的标准偏差: + +![](img/ed4b5723c1c1d00c8f305919ccfbd224.jpg) + +其中![](img/9f07a04e73180057e99b6fb08e88614c.jpg)和![](img/2e54e3c201411d186d4ed11b14e4d6b6.jpg)是两组的平均值,而![](img/0492c0bfd615cb5e61c847ece512ff51.jpg)是合并标准偏差(这是两个样本的标准偏差的组合,由样本大小加权): + +![](img/c32d91ff7a5a1e8df4cb8176b405ddda.jpg) + +其中![](img/43dc0e5b26df34d3e2f9c1ea065d2cec.jpg)和![](img/f654c11a6cebbc4eb0d47572ce0dd9ed.jpg)是样品尺寸,![](img/c24c5663bd51a01bc22bd9045f59cbfc.jpg)和![](img/b876141d76079657cceccf2a798df6b8.jpg)分别是两组的标准偏差。 + +有一个常用的尺度可以用科恩的 D 来解释效应的大小: + + +| D | 解释 | +| --- | --- | +| 0.2 条 | 小的 | +| 0.5 倍 | 中等的 | +| 0.8 倍 | 大的 | + +观察一些常见的理解效果,有助于理解这些解释。 + +```r +# compute effect size for gender difference in NHANES + +NHANES_sample <- + NHANES_adult %>% + drop_na(Height) %>% + sample_n(250) + +hsum <- + NHANES_sample %>% + group_by(Gender) %>% + summarize( + meanHeight = mean(Height), + varHeight = var(Height), + n = n() + ) + +#pooled SD +s_height_gender <- sqrt( + ((hsum$n[1] - 1) * hsum$varHeight[1] + (hsum$n[2] - 1) * hsum$varHeight[2]) / + (hsum$n[1] + hsum$n[2] - 2) +) + +#cohen's d +d_height_gender <- (hsum$meanHeight[2] - hsum$meanHeight[1]) / s_height_gender + +sprintf("Cohens d for male vs. female height = %0.2f", d_height_gender) +``` + +```r +## [1] "Cohens d for male vs. female height = 1.95" +``` + +参照上表,身高性别差异的影响大小(d=1.95)很大。我们也可以通过观察样本中男性和女性身高的分布来看到这一点。图[10.2](#fig:genderHist)显示,这两个分布虽然仍然重叠,但分离得很好,突出了这样一个事实:即使两个组之间的差异有很大的影响大小,每个组中的个体也会更像另一个组。 + +![Smoothed histogram plots for male and female heights in the NHANES dataset, showing clearly distinct but also clearly overlapping distributions.](img/file64.png) + +图 10.2 nhanes 数据集中男性和女性身高的平滑柱状图,显示了明显不同但明显重叠的分布。 + +同样值得注意的是,我们很少在科学中遇到这种规模的影响,部分原因是它们是如此明显的影响,以至于我们不需要科学研究来找到它们。正如我们将在第[17](#doing-reproducible-research)章中看到的那样,在科学研究中报告的非常大的影响往往反映出有问题的研究实践的使用,而不是自然界中真正的巨大影响。同样值得注意的是,即使有如此巨大的影响,这两种分布仍然是重叠的——会有一些女性比普通男性高,反之亦然。对于最有趣的科学效应来说,重叠的程度会大得多,所以我们不应该马上就基于一个大的效应大小得出关于不同人群的强有力的结论。 + +# + +## 10.2.2 皮尔逊 R + +Pearson 的 _r_ 也称为 _ 相关系数 _,是对两个连续变量之间线性关系强度的度量。我们将在[13](#modeling-continuous-relationships)章中更详细地讨论相关性,因此我们将保存该章的详细信息;这里,我们简单地介绍 _r_ 作为量化两个变量之间关系的方法。 + +_r_ 是一个在-1 到 1 之间变化的度量值,其中值 1 表示变量之间的完全正关系,0 表示没有关系,而-1 表示完全负关系。图[10.3](#fig:corrFig)显示了使用随机生成的数据的各种相关级别的示例。 + +![Examples of various levels of Pearson's r.](img/file65.png) + +图 10.3 不同水平皮尔逊 R 的示例。 + +# + +## 10.2.3 优势比 + +在我们之前关于概率的讨论中,我们讨论了概率的概念——也就是说,某些事件发生与未发生的相对可能性: + +![](img/87bcd112e30593468e1624d0dd165047.jpg) + +优势比只是两个优势比。例如,让我们以吸烟和肺癌为例。2012 年发表在《国际癌症杂志》上的一项研究(Pesch 等人 2012 年)关于吸烟者和从未吸烟的个体肺癌发生率的综合数据,通过许多不同的研究。请注意,这些数据来自病例对照研究,这意味着这些研究的参与者之所以被招募,是因为他们要么患了癌症,要么没有患癌症;然后检查他们的吸烟状况。因此,这些数字并不代表一般人群中吸烟者的癌症患病率,但它们可以告诉我们癌症与吸烟之间的关系。 + +```r +# create table for cancer occurrence depending on smoking status +smokingDf <- tibble( + NeverSmoked = c(2883, 220), + CurrentSmoker = c(3829, 6784), + row.names = c("NoCancer", "Cancer") +) +pander(smokingDf) +``` + + +| 从不吸烟 | 当前吸烟者 | 行名称 | +| --- | --- | --- | +| 2883 个 | 3829 年 | 无癌症者 | +| 220 | 6784 个 | 癌症 | + +我们可以将这些数字转换为每个组的优势比: + +```r +# convert smoking data to odds + +smokingDf <- + smokingDf %>% + mutate( + pNeverSmoked = NeverSmoked / sum(NeverSmoked), + pCurrentSmoker = CurrentSmoker / sum(CurrentSmoker) + ) + +oddsCancerNeverSmoked <- smokingDf$NeverSmoked[2] / smokingDf$NeverSmoked[1] +oddsCancerCurrentSmoker <- smokingDf$CurrentSmoker[2] / smokingDf$CurrentSmoker[1] +``` + +从未吸烟的人患肺癌的几率为 0.08,而目前吸烟者患肺癌的几率为 1.77。这些比值告诉我们两组患者患癌症的相对可能性: + +```r +#compute odds ratio + +oddsRatio <- oddsCancerCurrentSmoker/oddsCancerNeverSmoked +sprintf('odds ratio of cancer for smokers vs. nonsmokers: %0.3f',oddsRatio) +``` + +```r +## [1] "odds ratio of cancer for smokers vs. nonsmokers: 23.218" +``` + +23.22 的比值比告诉我们,吸烟者患癌症的几率大约是不吸烟者的 23 倍。 + +## 10.3 统计能力 + +请记住,在上一章中,根据 Neyman-Pearson 假设检验方法,我们必须指定我们对两种错误的容忍程度:假阳性(他们称之为 _I 型错误 _)和假阴性(他们称之为 _II 型错误 _)。人们经常把重点放在 I 型错误上,因为作出假阳性的声明通常被视为一件非常糟糕的事情;例如,韦克菲尔德(1999)现在不可信的声称自闭症与疫苗接种有关,导致了反疫苗情绪的大幅上升。儿童疾病,如麻疹。同样,我们也不想声称一种药物如果真的不能治愈一种疾病,这就是为什么 I 型错误的耐受性通常被设定为相当低的原因,通常是在![](img/6bdc138de1860434ee85d22ac40f9ae8.jpg)。但是 II 型错误呢? + +_ 统计功率 _ 的概念是对第二类错误的补充,也就是说,如果存在的话,很可能会得到一个正的结果: + +![](img/f013d353691220c2ac10c2a1eeb7a0a0.jpg) + +Neyman-Pearson 模型的另一个重要方面,我们没有在上面讨论过,事实上,除了说明 I 型和 II 型错误的可接受水平外,我们还必须描述一个特定的替代假设——即,我们希望检测的影响大小计算机断层扫描?否则,我们无法解释![](img/50705df736e9a7919e768cf8c4e4f794.jpg)——发现大效应的可能性总是高于发现小效应的可能性,因此![](img/50705df736e9a7919e768cf8c4e4f794.jpg)将根据我们试图检测的效应大小而有所不同。 + +影响功率的因素有三个: + +* 样本量:较大的样本提供更大的统计能力 +* 效果大小:给定的设计总是比小效果有更大的发现大效果的能力(因为发现大效果更容易) +* I 型错误率:I 型错误与功率之间存在一种关系,因此(其他所有情况相同)减少 I 型错误也会降低功率。 + +我们可以通过模拟看到这一点。首先,让我们模拟一个单独的实验,在这个实验中,我们使用标准 t 检验比较两组的平均值。我们将改变影响的大小(根据 Cohen's d 的规定)、I 类错误率和样本大小,并针对每一个,我们将检查重要结果(即功率)的比例是如何受到影响的。图[10.4](#fig:plotPowerSim)显示了功率如何随这些因素的函数而变化的示例。 + +```r +# Simulate power as a function of sample size, effect size, and alpha + +# create a set of functions to generate simulated results +powerDf <- + expand.grid( + sampSizePerGroup = c(12, 24, 48, 96), + effectSize = c(.2, .5, .8), + alpha = c(0.005, 0.05) + ) %>% + tidyr::expand(effectSize, sampSizePerGroup, alpha) %>% + group_by(effectSize, sampSizePerGroup, alpha) + +runPowerSim <- function(df, nsims = 1000) { + p <- array(NA, dim = nsims) + for (s in 1:nsims) { + data <- data.frame( + y = rnorm(df$sampSizePerGroup * 2), + group = array(0, dim = df$sampSizePerGroup * 2) + ) + + data$group[1:df$sampSizePerGroup] <- 1 + data$y[data$group == 1] <- data$y[data$group == 1] + df$effectSize + tt <- t.test(y ~ group, data = data) + p[s] <- tt$p.value + } + return(data.frame(power = mean(p < df$alpha))) +} + +# run the simulation +powerSimResults <- powerDf %>% + do(runPowerSim(.)) +``` + +![Results from power simulation, showing power as a function of sample size, with effect sizes shown as different colors, and alpha shown as line type. The standard criterion of 80 percent power is shown by the dotted black line.](img/file66.png) + +图 10.4 功率模拟结果,显示功率与样本大小的函数关系,效果大小显示为不同颜色,alpha 显示为线条类型。80%功率的标准标准标准用虚线黑线表示。 + +这个模拟表明,即使样本大小为 96,我们也几乎没有能力用![](img/5df69e5aed1e15865f5b409184e1f9ec.jpg)找到一个小的效果(![](img/dfc882492c011c73dbc2d4834b30ba47.jpg))。这意味着,一项旨在实现这一目标的研究将是徒劳的,也就是说,即使存在这种规模的真实效应,也几乎可以保证什么也找不到。 + +至少有两个重要的原因需要关注统计能力,一个是我们在这里讨论的,另一个是我们将在第[17 章](#doing-reproducible-research)中讨论的。如果你是一名研究人员,你可能不想花时间做无用的实验。运行一个动力不足的研究基本上是徒劳的,因为这意味着即使它存在,人们也很难找到效果。 + +# + +## 10.3.1 功率分析 + +幸运的是,有一些工具可以帮助我们确定实验的统计能力。这些工具最常见的用途是在计划一个实验时,我们想确定我们的样本需要多大才能有足够的能力发现我们感兴趣的效果。 + +假设我们有兴趣进行一项研究,研究 iOS 和 Android 设备用户之间的特定个性特征是如何不同的。我们的计划是收集两组个体并测量他们的人格特征,然后用 t 检验比较这两组。为了确定必要的样本大小,我们可以使用`pwr`库中的`pwr.t.test()`函数。 + +```r +# power analysis for Cohen's d = 0.5, for 80% power with alpha = 0.05 +pwr.t.test(d = 0.5, power = 0.8, sig.level = 0.05) +``` + +```r +## +## Two-sample t test power calculation +## +## n = 64 +## d = 0.5 +## sig.level = 0.05 +## power = 0.8 +## alternative = two.sided +## +## NOTE: n is number in *each* group +``` + +这告诉我们,为了有足够的力量找到中等规模的效果,我们需要每组至少 64 名受试者。在开始一项新的研究之前进行一次功率分析总是很重要的,以确保研究不会因为样本太小而无效。 + +您可能会想到,如果效果大小足够大,那么所需的样本将非常小。例如,如果我们运行相同的功率分析,效果大小为 d=3,那么我们将看到,每个组中只有大约 3 个受试者有足够的功率来发现差异。 + +```r +## +## Two-sample t test power calculation +## +## n = 3.1 +## d = 3 +## sig.level = 0.05 +## power = 0.8 +## alternative = two.sided +## +## NOTE: n is number in *each* group +``` + +然而,在科学界很少有人做这样一个实验,我们期望能发现如此巨大的影响——正如我们不需要统计数据来告诉我们 16 岁的孩子比 6 岁的孩子高一样。当我们进行功率分析时,我们需要指定一个对我们的研究合理的效应大小,这通常来自以前的研究。然而,在第[17 章](#doing-reproducible-research)中,我们将讨论一种被称为“赢家诅咒”的现象,这种现象可能导致公布的效果大小大于实际效果大小,因此也应记住这一点。 + +## 10.4 阅读建议 + +* [Hoekstra 等人对置信区间的强大误解。[高温 1]](http://www.ejwagenmakers.com/inpress/HoekstraEtAlPBR.pdf) \ No newline at end of file diff --git a/docs/10.x2.md b/docs/10.x2.md deleted file mode 100644 index 03712169b1cd449c76f9b5709107a38b2828212d..0000000000000000000000000000000000000000 --- a/docs/10.x2.md +++ /dev/null @@ -1,397 +0,0 @@ -# 10 置信区间、效应大小和统计功率 - -在前一章中,我们讨论了如何使用数据来测试假设。这些方法提供了一个二元答案:我们要么拒绝要么不拒绝无效假设。然而,这种决定忽略了一些重要的问题。首先,我们想知道我们对答案的不确定性有多大(不管它是如何发展的)。此外,有时我们没有一个明确的空假设,所以我们想看看什么范围的估计与数据一致。第二,我们想知道实际效果有多大,因为正如我们在前一章的减肥例子中看到的,统计显著的效果并不一定是一个实际重要的效果。 - -在这一章中,我们将讨论解决这两个问题的方法:置信区间提供对我们估计的不确定性的度量,以及影响大小提供一种标准化的方法来理解影响有多大。我们还将讨论 _ 统计能力 _ 的概念,它告诉我们,我们可以多么好地期望找到任何可能存在的真正效果。 - -## 10.1 置信区间 - -到目前为止,我们在这本书中的重点是估计统计数据的具体值。例如,假设我们想估计 nhanes 数据集中成年人的平均体重。我们可以从数据集中提取一个样本并估计平均值: - -```r -# take a sample from adults in NHANES and summarize their weight - -sampSize <- 250 -NHANES_sample <- sample_n(NHANES_adult, sampSize) - -sample_summary <- - NHANES_sample %>% - summarize( - meanWeight = mean(Weight), - sdWeight = sd(Weight) - ) -pander(sample_summary) -``` - - -| 平均重量 | S 重量 | -| --- | --- | -| 82.77 美元 | 22.27 条 | - -在这个样本中,平均重量是 82.77 千克。我们将其称为 _ 点估计 _,因为它为我们提供了一个描述差异的单一数字。然而,我们从前面对抽样误差的讨论中知道,这个估计有一些不确定性,用标准误差来描述。您还应该记住,标准误差由两个部分决定:总体标准偏差(分子)和样本大小的平方根(分母)。总体标准偏差是一个未知但固定的参数,不在我们的控制范围内,而样本量 _ 在我们的控制范围内。因此,我们可以通过增加样本量来降低估计的不确定性——达到整个群体规模的极限,此时完全没有不确定性,因为我们可以直接从整个群体的数据中计算群体参数。_ - -您可能还记得之前我们引入了 _ 置信区间 _ 的概念,这是一种描述统计估计不确定性的方法。请记住,置信区间描述了一个平均包含给定概率的真实总体参数的区间;例如,95%置信区间是一个将捕获 95%时间的真实总体参数的区间。请再次注意,这不是关于填充参数的语句;任何特定的置信区间都包含或不包含真参数。正如信任区间的发明者 Jerzy Neyman 所说: - -> “参数是一个未知常数,不能对其值作出概率陈述。”(J Neyman 1937) - -平均值的置信区间计算如下: - -![](img/1802bb15357660c8509890bd23bf9464.jpg) - -其中临界值由估计值的抽样分布确定。那么,重要的问题是抽样分布是什么。 - -# - -## 10.1.1 使用正态分布的置信区间 - -如果我们知道总体标准差,那么我们可以用正态分布来计算置信区间。我们通常不这样做,但对于我们的 nhanes 数据集示例,我们这样做(重量为 21.3)。 - -假设我们要计算平均值的 95%置信区间。临界值将是标准正态分布的值,它捕获了 95%的分布;这些仅仅是分布的 2.5%和 97.5%,我们可以使用 r 中的`qnorm()`函数计算得出![](img/62de2e04c50cdadabb13e0e5fa449b90.jpg)。因此,平均值(![](img/17ee279e0e3562706ec890e1da87b839.jpg))的置信区间为: - -![](img/593ce3f65adac443076014a8b5668e9b.jpg) - -利用样本(82.77)的估计平均值和已知的总体标准差,我们可以计算出[80.13,85.41]的置信区间。 - -# - -## 10.1.2 使用 t 分布的置信区间 - -如上所述,如果我们知道总体标准差,那么我们可以使用正态分布来计算我们的置信区间。但是,一般情况下,我们不会——在这种情况下,_t_ 分布更适合作为采样分布。记住,t 分布比正态分布略宽,特别是对于较小的样本,这意味着置信区间将比我们使用正态分布时的置信区间略宽。这包含了当我们基于小样本得出结论时产生的额外不确定性。 - -我们可以用类似于上述正态分布的方法计算 95%的置信区间,但临界值是由 _t_ 分布的 2.5%和 97.5%确定的,我们可以用 r 中的`qt()`函数计算,因此平均值(![](img/17ee279e0e3562706ec890e1da87b839.jpg))的 ence 间隔为: - -![](img/2ba466ac95c37a91093b33efe3a8c843.jpg) - -其中![](img/998149a807724e0687217b52f2785a85.jpg)是临界 t 值。对于 nhanes 权重示例(样本大小为 250),置信区间为: - -```r -# compute confidence intervals for weight in NHANES data - -sample_summary <- - sample_summary %>% - mutate( - cutoff_lower = qt(0.025, sampSize), - cutoff_upper = qt(0.975, sampSize), - CI_lower = meanWeight + cutoff_lower * sdWeight / sqrt(sampSize), - CI_upper = meanWeight + cutoff_upper * sdWeight / sqrt(sampSize) - ) -pander(sample_summary) -``` - - -| meanWeight | sdWeight | 切断阀 | 上切断 | Ci_ 下 | Ci_ 上部 | -| --- | --- | --- | --- | --- | --- | -| 82.77 | 22.27 | -1.97 条 | 1.97 条 | 80 | 85.54 美元 | - -请记住,这并不能告诉我们关于真实总体值在这个区间内的概率,因为它是一个固定参数(我们知道它是 81.77,因为在这种情况下我们有整个总体),并且它或者不在这个特定区间内(i 在这种情况下,确实如此)。相反,它告诉我们,从长远来看,如果我们使用这个过程计算置信区间,95%的置信区间将捕获真正的总体参数。 - -# - -## 10.1.3 置信区间和样本量 - -由于标准误差随样本量的减小而减小,平均置信区间应随着样本量的增大而变窄,从而为我们的估计提供了越来越严格的界限。图[10.1](#fig:CISampSize)显示了置信区间将如何作为权重示例的样本大小函数而变化的示例。从图中可以明显看出,随着样本量的增加,置信区间变得越来越紧,但是增加样本会产生递减的回报,这与置信区间项的分母与样本量的平方根成正比的事实相一致。E. - -![An example of the effect of sample size on the width of the confidence interval for the mean.](img/file63.png) - -图 10.1 样本量对平均值置信区间宽度影响的示例。 - -# - -## 10.1.4 使用引导程序计算置信区间 - -在某些情况下,我们不能假定正态性,或者我们不知道统计的抽样分布。在这些情况下,我们可以使用引导程序(我们在[8](#resampling-and-simulation)章中介绍了它)。作为提醒,引导程序需要重复地用替换项对数据 _ 进行重采样,然后使用这些样本上计算的统计分布作为统计分布的抽样代理。_ - -早些时候,我们使用手工编写的代码运行引导程序,但是 R 包含一个名为`boot`的包,我们可以使用它运行引导程序并计算置信区间。让我们用它来计算 nhanes 样本中权重的置信区间。 - -```r -# compute bootstrap confidence intervals on NHANES weight data - -meanWeight <- function(df, foo) { - return(mean(df[foo, ]$Weight)) -} - -bs <- boot(NHANES_sample, meanWeight, 1000) - -# use the percentile bootstrap -bootci <- boot.ci(bs, type = "perc") -print("Bootstrap confidence intervals:") -``` - -```r -## [1] "Bootstrap confidence intervals:" -``` - -```r -tibble( - lower = bootci$perc[4], - upper = bootci$perc[5] -) %>% - pander() -``` - - -| 降低 | 上面的 | -| --- | --- | -| 第 80.12 条 | 85.71 美元 | - -这些值与使用上面的 t 分布得到的值相当接近,尽管不完全相同。 - -# - -## 10.1.5 置信区间与假设检验的关系 - -置信区间与假设检验有着密切的关系。尤其是,如果置信区间不包括无效假设,那么相关的统计检验将具有统计学意义。例如,如果您使用![](img/6bdc138de1860434ee85d22ac40f9ae8.jpg)测试样本的平均值是否大于零,您可以简单地检查是否在平均值的 95%置信区间内包含零。 - -如果我们想比较两个条件的平均值,事情会变得更棘手(Schenker 和绅士 2001)。有几个情况是清楚的。首先,如果每个均值都包含在另一个均值的置信区间内,那么在所选置信水平上肯定没有显著差异。其次,如果置信区间之间没有重叠,那么在所选水平上肯定存在显著差异;事实上,该测试基本上是 _ 保守 _,因此实际误差率将低于所选水平。但是,如果置信区间彼此重叠,但不包含另一组的平均值,情况会怎样呢?在这种情况下,答案取决于两个变量的相对可变性,没有一般的答案。一般来说,我们应该避免对重叠的置信区间使用“视觉测试”,因为它通常会导致较高的假阴性(II 型)错误率。 - -## 10.2 效果大小 - -> “统计显著性是最不有趣的结果。你应该用数量尺度来描述结果——不仅仅是治疗对人有影响,还有它对人有多大的影响。”基因玻璃(Ref) - -在最后一章中,我们讨论了统计学意义不一定反映实际意义的观点。为了讨论实际意义,我们需要一种标准的方法来根据实际数据描述效应的大小,我们称之为 _ 效应大小 _。在本节中,我们将介绍这个概念,并讨论计算影响大小的各种方法。 - -效应大小是一种标准化的测量,它将某些统计效应的大小与参考量(如统计的可变性)进行比较。在一些科学和工程领域中,这个概念被称为“信噪比”。有许多不同的方法可以量化效果大小,这取决于数据的性质。 - -# - -## 10.2.1 科恩 - -影响大小最常见的度量之一是以统计学家雅各布·科恩(Jacob Cohen)的名字命名的 _ 科恩的 D_,他在 1994 年发表的题为“地球是圆的(P<;.05)”的论文中最为著名。它用于量化两种方法之间的差异,根据它们的标准偏差: - -![](img/ed4b5723c1c1d00c8f305919ccfbd224.jpg) - -其中![](img/9f07a04e73180057e99b6fb08e88614c.jpg)和![](img/2e54e3c201411d186d4ed11b14e4d6b6.jpg)是两组的平均值,而![](img/0492c0bfd615cb5e61c847ece512ff51.jpg)是合并标准偏差(这是两个样本的标准偏差的组合,由样本大小加权): - -![](img/c32d91ff7a5a1e8df4cb8176b405ddda.jpg) - -其中![](img/43dc0e5b26df34d3e2f9c1ea065d2cec.jpg)和![](img/f654c11a6cebbc4eb0d47572ce0dd9ed.jpg)是样品尺寸,![](img/c24c5663bd51a01bc22bd9045f59cbfc.jpg)和![](img/b876141d76079657cceccf2a798df6b8.jpg)分别是两组的标准偏差。 - -有一个常用的尺度可以用科恩的 D 来解释效应的大小: - - -| D | 解释 | -| --- | --- | -| 0.2 条 | 小的 | -| 0.5 倍 | 中等的 | -| 0.8 倍 | 大的 | - -观察一些常见的理解效果,有助于理解这些解释。 - -```r -# compute effect size for gender difference in NHANES - -NHANES_sample <- - NHANES_adult %>% - drop_na(Height) %>% - sample_n(250) - -hsum <- - NHANES_sample %>% - group_by(Gender) %>% - summarize( - meanHeight = mean(Height), - varHeight = var(Height), - n = n() - ) - -#pooled SD -s_height_gender <- sqrt( - ((hsum$n[1] - 1) * hsum$varHeight[1] + (hsum$n[2] - 1) * hsum$varHeight[2]) / - (hsum$n[1] + hsum$n[2] - 2) -) - -#cohen's d -d_height_gender <- (hsum$meanHeight[2] - hsum$meanHeight[1]) / s_height_gender - -sprintf("Cohens d for male vs. female height = %0.2f", d_height_gender) -``` - -```r -## [1] "Cohens d for male vs. female height = 1.95" -``` - -参照上表,身高性别差异的影响大小(d=1.95)很大。我们也可以通过观察样本中男性和女性身高的分布来看到这一点。图[10.2](#fig:genderHist)显示,这两个分布虽然仍然重叠,但分离得很好,突出了这样一个事实:即使两个组之间的差异有很大的影响大小,每个组中的个体也会更像另一个组。 - -![Smoothed histogram plots for male and female heights in the NHANES dataset, showing clearly distinct but also clearly overlapping distributions.](img/file64.png) - -图 10.2 nhanes 数据集中男性和女性身高的平滑柱状图,显示了明显不同但明显重叠的分布。 - -同样值得注意的是,我们很少在科学中遇到这种规模的影响,部分原因是它们是如此明显的影响,以至于我们不需要科学研究来找到它们。正如我们将在第[17](#doing-reproducible-research)章中看到的那样,在科学研究中报告的非常大的影响往往反映出有问题的研究实践的使用,而不是自然界中真正的巨大影响。同样值得注意的是,即使有如此巨大的影响,这两种分布仍然是重叠的——会有一些女性比普通男性高,反之亦然。对于最有趣的科学效应来说,重叠的程度会大得多,所以我们不应该马上就基于一个大的效应大小得出关于不同人群的强有力的结论。 - -# - -## 10.2.2 皮尔逊 R - -Pearson 的 _r_ 也称为 _ 相关系数 _,是对两个连续变量之间线性关系强度的度量。我们将在[13](#modeling-continuous-relationships)章中更详细地讨论相关性,因此我们将保存该章的详细信息;这里,我们简单地介绍 _r_ 作为量化两个变量之间关系的方法。 - -_r_ 是一个在-1 到 1 之间变化的度量值,其中值 1 表示变量之间的完全正关系,0 表示没有关系,而-1 表示完全负关系。图[10.3](#fig:corrFig)显示了使用随机生成的数据的各种相关级别的示例。 - -![Examples of various levels of Pearson's r.](img/file65.png) - -图 10.3 不同水平皮尔逊 R 的示例。 - -# - -## 10.2.3 优势比 - -在我们之前关于概率的讨论中,我们讨论了概率的概念——也就是说,某些事件发生与未发生的相对可能性: - -![](img/87bcd112e30593468e1624d0dd165047.jpg) - -优势比只是两个优势比。例如,让我们以吸烟和肺癌为例。2012 年发表在《国际癌症杂志》上的一项研究(Pesch 等人 2012 年)关于吸烟者和从未吸烟的个体肺癌发生率的综合数据,通过许多不同的研究。请注意,这些数据来自病例对照研究,这意味着这些研究的参与者之所以被招募,是因为他们要么患了癌症,要么没有患癌症;然后检查他们的吸烟状况。因此,这些数字并不代表一般人群中吸烟者的癌症患病率,但它们可以告诉我们癌症与吸烟之间的关系。 - -```r -# create table for cancer occurrence depending on smoking status -smokingDf <- tibble( - NeverSmoked = c(2883, 220), - CurrentSmoker = c(3829, 6784), - row.names = c("NoCancer", "Cancer") -) -pander(smokingDf) -``` - - -| 从不吸烟 | 当前吸烟者 | 行名称 | -| --- | --- | --- | -| 2883 个 | 3829 年 | 无癌症者 | -| 220 | 6784 个 | 癌症 | - -我们可以将这些数字转换为每个组的优势比: - -```r -# convert smoking data to odds - -smokingDf <- - smokingDf %>% - mutate( - pNeverSmoked = NeverSmoked / sum(NeverSmoked), - pCurrentSmoker = CurrentSmoker / sum(CurrentSmoker) - ) - -oddsCancerNeverSmoked <- smokingDf$NeverSmoked[2] / smokingDf$NeverSmoked[1] -oddsCancerCurrentSmoker <- smokingDf$CurrentSmoker[2] / smokingDf$CurrentSmoker[1] -``` - -从未吸烟的人患肺癌的几率为 0.08,而目前吸烟者患肺癌的几率为 1.77。这些比值告诉我们两组患者患癌症的相对可能性: - -```r -#compute odds ratio - -oddsRatio <- oddsCancerCurrentSmoker/oddsCancerNeverSmoked -sprintf('odds ratio of cancer for smokers vs. nonsmokers: %0.3f',oddsRatio) -``` - -```r -## [1] "odds ratio of cancer for smokers vs. nonsmokers: 23.218" -``` - -23.22 的比值比告诉我们,吸烟者患癌症的几率大约是不吸烟者的 23 倍。 - -## 10.3 统计能力 - -请记住,在上一章中,根据 Neyman-Pearson 假设检验方法,我们必须指定我们对两种错误的容忍程度:假阳性(他们称之为 _I 型错误 _)和假阴性(他们称之为 _II 型错误 _)。人们经常把重点放在 I 型错误上,因为作出假阳性的声明通常被视为一件非常糟糕的事情;例如,韦克菲尔德(1999)现在不可信的声称自闭症与疫苗接种有关,导致了反疫苗情绪的大幅上升。儿童疾病,如麻疹。同样,我们也不想声称一种药物如果真的不能治愈一种疾病,这就是为什么 I 型错误的耐受性通常被设定为相当低的原因,通常是在![](img/6bdc138de1860434ee85d22ac40f9ae8.jpg)。但是 II 型错误呢? - -_ 统计功率 _ 的概念是对第二类错误的补充,也就是说,如果存在的话,很可能会得到一个正的结果: - -![](img/f013d353691220c2ac10c2a1eeb7a0a0.jpg) - -Neyman-Pearson 模型的另一个重要方面,我们没有在上面讨论过,事实上,除了说明 I 型和 II 型错误的可接受水平外,我们还必须描述一个特定的替代假设——即,我们希望检测的影响大小计算机断层扫描?否则,我们无法解释![](img/50705df736e9a7919e768cf8c4e4f794.jpg)——发现大效应的可能性总是高于发现小效应的可能性,因此![](img/50705df736e9a7919e768cf8c4e4f794.jpg)将根据我们试图检测的效应大小而有所不同。 - -影响功率的因素有三个: - -* 样本量:较大的样本提供更大的统计能力 -* 效果大小:给定的设计总是比小效果有更大的发现大效果的能力(因为发现大效果更容易) -* I 型错误率:I 型错误与功率之间存在一种关系,因此(其他所有情况相同)减少 I 型错误也会降低功率。 - -我们可以通过模拟看到这一点。首先,让我们模拟一个单独的实验,在这个实验中,我们使用标准 t 检验比较两组的平均值。我们将改变影响的大小(根据 Cohen's d 的规定)、I 类错误率和样本大小,并针对每一个,我们将检查重要结果(即功率)的比例是如何受到影响的。图[10.4](#fig:plotPowerSim)显示了功率如何随这些因素的函数而变化的示例。 - -```r -# Simulate power as a function of sample size, effect size, and alpha - -# create a set of functions to generate simulated results -powerDf <- - expand.grid( - sampSizePerGroup = c(12, 24, 48, 96), - effectSize = c(.2, .5, .8), - alpha = c(0.005, 0.05) - ) %>% - tidyr::expand(effectSize, sampSizePerGroup, alpha) %>% - group_by(effectSize, sampSizePerGroup, alpha) - -runPowerSim <- function(df, nsims = 1000) { - p <- array(NA, dim = nsims) - for (s in 1:nsims) { - data <- data.frame( - y = rnorm(df$sampSizePerGroup * 2), - group = array(0, dim = df$sampSizePerGroup * 2) - ) - - data$group[1:df$sampSizePerGroup] <- 1 - data$y[data$group == 1] <- data$y[data$group == 1] + df$effectSize - tt <- t.test(y ~ group, data = data) - p[s] <- tt$p.value - } - return(data.frame(power = mean(p < df$alpha))) -} - -# run the simulation -powerSimResults <- powerDf %>% - do(runPowerSim(.)) -``` - -![Results from power simulation, showing power as a function of sample size, with effect sizes shown as different colors, and alpha shown as line type. The standard criterion of 80 percent power is shown by the dotted black line.](img/file66.png) - -图 10.4 功率模拟结果,显示功率与样本大小的函数关系,效果大小显示为不同颜色,alpha 显示为线条类型。80%功率的标准标准标准用虚线黑线表示。 - -这个模拟表明,即使样本大小为 96,我们也几乎没有能力用![](img/5df69e5aed1e15865f5b409184e1f9ec.jpg)找到一个小的效果(![](img/dfc882492c011c73dbc2d4834b30ba47.jpg))。这意味着,一项旨在实现这一目标的研究将是徒劳的,也就是说,即使存在这种规模的真实效应,也几乎可以保证什么也找不到。 - -至少有两个重要的原因需要关注统计能力,一个是我们在这里讨论的,另一个是我们将在第[17 章](#doing-reproducible-research)中讨论的。如果你是一名研究人员,你可能不想花时间做无用的实验。运行一个动力不足的研究基本上是徒劳的,因为这意味着即使它存在,人们也很难找到效果。 - -# - -## 10.3.1 功率分析 - -幸运的是,有一些工具可以帮助我们确定实验的统计能力。这些工具最常见的用途是在计划一个实验时,我们想确定我们的样本需要多大才能有足够的能力发现我们感兴趣的效果。 - -假设我们有兴趣进行一项研究,研究 iOS 和 Android 设备用户之间的特定个性特征是如何不同的。我们的计划是收集两组个体并测量他们的人格特征,然后用 t 检验比较这两组。为了确定必要的样本大小,我们可以使用`pwr`库中的`pwr.t.test()`函数。 - -```r -# power analysis for Cohen's d = 0.5, for 80% power with alpha = 0.05 -pwr.t.test(d = 0.5, power = 0.8, sig.level = 0.05) -``` - -```r -## -## Two-sample t test power calculation -## -## n = 64 -## d = 0.5 -## sig.level = 0.05 -## power = 0.8 -## alternative = two.sided -## -## NOTE: n is number in *each* group -``` - -这告诉我们,为了有足够的力量找到中等规模的效果,我们需要每组至少 64 名受试者。在开始一项新的研究之前进行一次功率分析总是很重要的,以确保研究不会因为样本太小而无效。 - -您可能会想到,如果效果大小足够大,那么所需的样本将非常小。例如,如果我们运行相同的功率分析,效果大小为 d=3,那么我们将看到,每个组中只有大约 3 个受试者有足够的功率来发现差异。 - -```r -## -## Two-sample t test power calculation -## -## n = 3.1 -## d = 3 -## sig.level = 0.05 -## power = 0.8 -## alternative = two.sided -## -## NOTE: n is number in *each* group -``` - -然而,在科学界很少有人做这样一个实验,我们期望能发现如此巨大的影响——正如我们不需要统计数据来告诉我们 16 岁的孩子比 6 岁的孩子高一样。当我们进行功率分析时,我们需要指定一个对我们的研究合理的效应大小,这通常来自以前的研究。然而,在第[17 章](#doing-reproducible-research)中,我们将讨论一种被称为“赢家诅咒”的现象,这种现象可能导致公布的效果大小大于实际效果大小,因此也应记住这一点。 - -## 10.4 阅读建议 - -* [Hoekstra 等人对置信区间的强大误解。[高温 1]](http://www.ejwagenmakers.com/inpress/HoekstraEtAlPBR.pdf) \ No newline at end of file diff --git a/docs/11.md b/docs/11.md index 34b3855930ec8971613a738d548330fc99cb1b9d..f9a958b29e54acc6fb9e02ccb0aef6b212b7fd02 100644 --- a/docs/11.md +++ b/docs/11.md @@ -1,3 +1,571 @@ # 11 贝叶斯统计 -在本章中,我们将采用统计建模和推断的方法,这与您在[9](#hypothesis-testing)章中遇到的空假设测试框架形成对比。这是继托马斯·拜斯牧师之后的“贝叶斯统计”,你已经在第[3 章](#probability)中遇到过他的定理。在本章中,您将了解贝叶斯定理如何提供一种理解数据的方法,从而解决我们讨论的关于空假设测试的许多概念性问题。 \ No newline at end of file +在本章中,我们将采用统计建模和推断的方法,这与您在[9](#hypothesis-testing)章中遇到的空假设测试框架形成对比。这是继托马斯·拜斯牧师之后的“贝叶斯统计”,你已经在第[3 章](#probability)中遇到过他的定理。在本章中,您将了解贝叶斯定理如何提供一种理解数据的方法,从而解决我们讨论的关于空假设测试的许多概念性问题。 + +## 11.1 生成模型 + +假设你走在街上,你的一个朋友路过,但没有打招呼。你可能会试图决定为什么会发生这种事——他们没有看到你吗?他们生你的气吗?你突然被一个魔法隐身盾牌遮住了吗?贝叶斯统计背后的一个基本思想是,我们希望根据数据本身推断出数据是如何生成的细节。在这种情况下,您希望使用数据(即,您的朋友没有打招呼)来推断生成数据的过程(例如,他们是否真的看到您,他们对您的感觉如何等)。 + +生成模型背后的思想是,我们观察由 _ 潜在的 _(看不见)过程生成的数据,通常在过程中具有一定的随机性。事实上,当我们从一个群体中抽取一个数据样本,并从样本中估计一个参数时,我们所做的实质上是尝试学习一个潜在变量(群体平均值)的值,这个潜在变量是通过对观察到的数据(样本平均值)进行抽样而产生的。 + +如果我们知道潜在变量的值,那么很容易重建观测数据应该是什么样子。例如,假设我们在抛硬币,我们知道这是公平的。我们可以用 p=0.5 的二项式分布来描述硬币,然后我们可以从这种分布中生成随机样本,以观察观察到的数据应该是什么样的。然而,总的来说,我们处于相反的情况:我们不知道潜在的利益变量的价值,但我们有一些数据,我们想用来估计它。 + +## 11.2 贝叶斯定理与逆推理 + +贝叶斯统计之所以有它的名字,是因为它利用了贝叶斯定理,从数据中作出推论,使之返回到生成数据的(潜在)模型的某些特征。假设我们想知道一枚硬币是否公平。为了测试这一点,我们将硬币翻转 10 次,然后拿出 7 个硬币头。在这个测试之前,我们很确定硬币是公平的(即![](img/cd9bbb538bd1c0dbde95ceab64ec7f61.jpg)),但是这些数据确实让我们停顿了一下。我们已经知道如何计算条件概率,如果硬币真的是公平的(htg1),我们会用二项分布从 10 中倒出 7 个或更多的头。 + +```r +# compute the conditional probability of 7 or more heads when p(heads)=0.5 +sprintf( + "p(7 or more heads | p(heads) = 0.5) = %.3f", + pbinom(7, 10, .5, lower.tail = FALSE) +) +``` + +```r +## [1] "p(7 or more heads | p(heads) = 0.5) = 0.055" +``` + +这是一个相当小的数字,但这个数字并不能真正回答我们所问的问题——它告诉我们,考虑到头部的特定概率,7 个或更多头部的可能性,而我们真正想知道的是头部的概率。这听起来应该很熟悉,因为这正是我们进行无效假设测试的情况,它告诉我们数据的可能性,而不是假设的可能性。 + +记住,贝叶斯定理为我们提供了一个工具,我们需要它来反转条件概率: + +![](img/2f17a9b425c331238312e908893c6b76.jpg) + +我们可以认为这个定理有四个部分: + +* 先验(![](img/995ec7e5ce638c761412c3a72b1205fc.jpg)):我们在看到数据 D 之前对假设 H 的信任程度。 +* 可能性(![](img/f9a6ac6779edc30af459b2a85f233a90.jpg)):假设 h 下观察数据 d 的可能性有多大? +* 边际可能性(![](img/64a7abdfb98eadee6db62a3795edd609.jpg)):观察到的数据结合所有可能的假设的可能性有多大? +* 后验(![](img/9dbb3da99dde7c1ed5b3f9c07b24916e.jpg)):我们对假设 h 的最新看法,给出了数据 d。 + +这里我们看到了频率主义和贝叶斯统计的主要区别之一。频率主义者不相信假设概率的概念(即我们对假设的信仰程度),对他们来说,假设要么是真的,要么不是真的。另一种说法是,对于频率主义者,假设是固定的,数据是随机的,这就是为什么频率主义者 ST 推理的重点是描述给定假设(即 P 值)的数据概率。另一方面,贝叶斯则乐于对数据和假设进行概率陈述。 + +## 11.3 进行贝叶斯估计 + +我们最终希望使用贝叶斯统计来测试假设,但是在我们这样做之前,我们需要估计测试假设所需的参数。这里我们将介绍贝叶斯估计的过程。让我们用另一个筛选示例:机场安全筛选。如果你像我一样经常飞行,那么在随机爆炸物筛选结果恢复正常之前只是个时间问题;2001 年 9 月 11 日之后不久,当机场保安人员特别紧张时,我有过这种特别不幸的经历。 + +安全人员想知道的是,考虑到机器进行了正面测试,一个人携带爆炸物的可能性是多少。让我们来介绍一下如何使用贝叶斯分析计算这个值。 + +# + +## 11.3.1 规定 + +为了使用贝叶斯定理,我们首先需要为假设指定先验概率。在这种情况下,我们不知道实数,但我们可以假设它很小。根据[联邦航空局](https://www.faa.gov/air_traffic/by_the_numbers/media/Air_Traffic_by_the_Numbers_2018.pdf),2017 年美国有 971595898 名乘客。在这个例子中,假设有一个旅行者的包里装着炸药 + +```r +prior <- 1/971595898 +``` + +# + +## 11.3.2 收集一些数据 + +数据由炸药筛选试验结果组成。让我们假设安全人员通过他们的测试设备运行了 10 次袋子,它给出了 10 次测试中 9 次的正读数。 + +```r +nTests <- 10 +nPositives <- 9 +``` + +# + +## 11.3.3 计算可能性 + +我们要在假设袋中有炸药的情况下计算数据的可能性。假设我们知道测试的灵敏度是 0.99——也就是说,当一个设备存在时,它将 99%的时间检测到它。为了确定在设备存在的假设下数据的可能性,我们可以将每个测试视为伯努利试验(即结果为真或假的试验),成功概率为 0.99,我们可以使用二项式分布来建模。 + +```r +likelihood <- dbinom(nPositives, nTests, 0.99) +likelihood +``` + +```r +## [1] 0.091 +``` + +# + +## 11.3.4 计算边际可能性 + +我们还需要知道数据的总体可能性——也就是说,在 10 个测试中找出 9 个阳性。计算边际似然性通常是贝叶斯分析中最困难的方面之一,但对于我们的例子来说,这很简单,因为我们可以利用我们在[3.7 节](#bayestheorem)中介绍的贝叶斯定理的具体形式: + +![](img/b94584013098374a0ab47488f17113bf.jpg) + +在这种情况下,边际可能性是存在或不存在爆炸物时数据可能性的加权平均值,乘以存在爆炸物的概率(即先验概率)。在这种情况下,假设我们知道测试的特异性是 0.9,这样当没有爆炸物时,阳性结果的可能性是 0.1。 + +我们可以用 r 计算,如下所示: + +```r +marginal_likelihood <- + dbinom( + x = nPositives, + size = nTests, + prob = 0.99 + ) * prior + + dbinom( + x = nPositives, + size = nTests, + prob = .1 + ) * + (1 - prior) + +sprintf("marginal likelihood = %.3e", marginal_likelihood) +``` + +```r +## [1] "marginal likelihood = 9.094e-09" +``` + +# + +## 11.3.5 计算后部 + +我们现在有了所有需要计算炸药存在后验概率的部分,假设在 10 个测试中观察到 9 个阳性结果。 + +```r +posterior <- (likelihood * prior) / marginal_likelihood +posterior +``` + +```r +## [1] 0.01 +``` + +这一结果表明,袋中爆炸物的概率远高于之前的概率,但几乎不确定,再次强调了一个事实,即测试罕见事件几乎总是容易产生大量的假阳性。 + +## 11.4 估计后验分布 + +在前一个例子中,只有两种可能的结果——爆炸物要么在那里,要么不在那里——我们想知道给出数据后,哪种结果最有可能。但是,在其他情况下,我们希望使用贝叶斯估计来估计参数的数值。比如说,我们想知道一种新的止痛药的有效性;为了测试这一点,我们可以给一组病人服用这种药物,然后询问他们服用这种药物后疼痛是否有所改善。我们可以使用贝叶斯分析来估计药物对谁有效的比例。 + +# + +## 11.4.1 规定 + +在这种情况下,我们没有任何关于药物有效性的先验信息,因此我们将使用 _ 均匀分布 _ 作为先验值,因为所有值在均匀分布下都是相同的。为了简化示例,我们将只查看 99 个可能有效性值的子集(从.01 到.99,步骤为.01)。因此,每个可能值的先验概率为 1/99。 + +# + +## 11.4.2 收集一些数据 + +我们需要一些数据来估计药物的效果。假设我们给 100 个人用药,结果如下: + +```r +# create a table with results +nResponders <- 64 +nTested <- 100 + +drugDf <- tibble( + outcome = c("improved", "not improved"), + number = c(nResponders, nTested - nResponders) +) +pander(drugDf) +``` + + +| 结果 | 数 | +| --- | --- | +| 改进 | 64 个 | +| 没有改善 | 36 岁 | + +# + +## 11.4.3 计算可能性 + +我们可以使用 r 中的`dbinom()`函数计算有效性参数的任何特定值下的数据的可能性。在图[11.1](#fig:like2)中,您可以看到响应器数量对![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)几个不同值的可能性曲线。从这一点来看,我们观察到的数据在![](img/7ce19d5535bbf697999957a6831830c7.jpg)假设下的可能性相对较大,在![](img/52fe760c55a8b94c6345c1ba173d254d.jpg)假设下的可能性相对较小,在![](img/565101aba21de92eb8f6077836e5144e.jpg)假设下的可能性相对较小。贝叶斯推理的一个基本思想是,我们将试图找到我们感兴趣的参数的值,这使得数据最有可能,同时也考虑到我们的先验知识。 + +![Likelihood of each possible number of responders under several different hypotheses (p(respond)=0.5 (red), 0.7 (green), 0.3 (black). Observed value shown in blue.](img/file67.png) + +图 11.1 几个不同假设下每个可能数量的应答者的可能性(P(应答)=0.5(红色),0.7(绿色),0.3(黑色)。观察值以蓝色显示。 + +# + +## 11.4.4 计算边际可能性 + +除了不同假设下数据的可能性外,我们还需要知道数据的总体可能性,并结合所有假设(即边际可能性)。这种边际可能性主要是重要的,因为它有助于确保后验值是真实概率。在这种情况下,我们使用一组离散的可能参数值使得计算边际似然变得容易,因为我们只需计算每个假设下每个参数值的似然,并将它们相加。 + +```r +# compute marginal likelihood +likeDf <- + likeDf %>% + mutate(uniform_prior = array(1 / n())) + +# multiply each likelihood by prior and add them up +marginal_likelihood <- + sum( + dbinom( + x = nResponders, # the number who responded to the drug + size = 100, # the number tested + likeDf$presp # the likelihood of each response + ) * likeDf$uniform_prior + ) + +sprintf("marginal likelihood = %0.4f", marginal_likelihood) +``` + +```r +## [1] "marginal likelihood = 0.0100" +``` + +# + +## 11.4.5 计算后部 + +我们现在有了所有需要计算![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)所有可能值的后验概率分布的部分,如图[11.2](#fig:posteriorDist)所示。 + +```r +# Create data for use in figure +bayesDf <- + tibble( + steps = seq(from = 0.01, to = 0.99, by = 0.01) + ) %>% + mutate( + likelihoods = dbinom( + x = nResponders, + size = 100, + prob = steps + ), + priors = dunif(steps) / length(steps), + posteriors = (likelihoods * priors) / marginal_likelihood + ) +``` + +![Posterior probability distribution plotted in blue against uniform prior distribution (dotted black line).](img/file68.png) + +图 11.2 蓝色后验概率分布图与均匀前验概率分布图(黑色虚线)。 + +# + +## 11.4.6 最大后验概率(MAP)估计 + +根据我们的数据,我们希望获得样本的估计值![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)。一种方法是找到后验概率最高的![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)值,我们称之为后验概率(map)估计的 _ 最大值。我们可以从[11.2](#fig:posteriorDist)中的数据中找到:_ + +```r +# compute MAP estimate +MAP_estimate <- + bayesDf %>% + arrange(desc(posteriors)) %>% + slice(1) %>% + pull(steps) + +sprintf("MAP estimate = %0.4f", MAP_estimate) +``` + +```r +## [1] "MAP estimate = 0.6400" +``` + +请注意,这只是样本中反应者的比例——这是因为之前的反应是一致的,因此没有影响我们的反应。 + +# + +## 11.4.7 可信区间 + +通常我们想知道的不仅仅是对后位的单一估计,而是一个我们确信后位下降的间隔。我们之前讨论过频繁推理背景下的置信区间概念,您可能还记得,置信区间的解释特别复杂。我们真正想要的是一个区间,在这个区间中,我们确信真正的参数会下降,而贝叶斯统计可以给我们一个这样的区间,我们称之为 _ 可信区间 _。 + +在某些情况下,可信区间可以根据已知的分布用数字 _ 计算,但从后验分布中取样,然后计算样本的分位数更常见。当我们没有一个简单的方法来用数字表示后验分布时,这是特别有用的,在实际的贝叶斯数据分析中经常是这样。_ + +我们将使用一个简单的算法从我们的后验分布中生成样本,该算法被称为[_ 拒绝抽样 _](https://am207.github.io/2017/wiki/rejectionsampling.html)。我们的想法是从一个均匀分布中选择 x 的随机值(在本例中为![](img/cb86d3a73cc424b0260d4020c4b40755.jpg))和 y 的随机值(在本例中为![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)的后验概率)。然后,只有在![](img/9c86ebacc1cbef2bb12c73aeb21d23e9.jpg)—这种情况下,如果随机选择的 y 值小于 y 的实际后验概率,我们才接受样本。图[11.3](#fig:rejectionSampling)显示了使用拒绝抽样的样本的直方图示例,以及使用 th 获得的 95%可信区间。是方法。 + +```r +# Compute credible intervals for example + +nsamples <- 100000 + +# create random uniform variates for x and y +x <- runif(nsamples) +y <- runif(nsamples) + +# create f(x) +fx <- dbinom(x = nResponders, size = 100, prob = x) + +# accept samples where y < f(x) +accept <- which(y < fx) +accepted_samples <- x[accept] + +credible_interval <- quantile(x = accepted_samples, probs = c(0.025, 0.975)) +pander(credible_interval) +``` + + +| 2.5% | 98% | +| --- | --- | +| 0.54 分 | 0.72 分 | + +![Rejection sampling example.The black line shows the density of all possible values of p(respond); the blue lines show the 2.5th and 97.5th percentiles of the distribution, which represent the 95 percent credible interval for the estimate of p(respond).](img/file69.png) + +图 11.3 拒绝抽样示例。黑线表示 P(响应)所有可能值的密度;蓝线表示分布的 2.5%和 97.5%,表示 P(响应)估计的 95%可信区间。 + +这个可信区间的解释更接近于我们希望从置信区间(但不能)中得到的结果:它告诉我们,95%的概率![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)的值介于这两个值之间。重要的是,它表明我们对![](img/7dde591ac08edac3e5ac5c432367acde.jpg)有很高的信心,这意味着该药物似乎有积极的效果。 + +# + +## 11.4.8 不同先验的影响 + +在上一个例子中,我们在之前使用了 _ 平面,这意味着我们没有任何理由相信![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)的任何特定值或多或少是可能的。然而,假设我们是从一些以前的数据开始的:在之前的一项研究中,研究人员测试了 20 个人,发现其中 10 个人的反应是积极的。这将引导我们从先前的信念开始,即治疗对 50%的人有效果。我们可以做与上面相同的计算,但是使用我们以前的研究中的信息来通知我们之前的研究(参见图[11.4](#fig:posteriorDistPrior))。_ + +```r +# compute likelihoods for data under all values of p(heads) +# using a flat or empirical prior. +# here we use the quantized values from .01 to .99 in steps of 0.01 + +df <- + tibble( + steps = seq(from = 0.01, to = 0.99, by = 0.01) + ) %>% + mutate( + likelihoods = dbinom(nResponders, 100, steps), + priors_flat = dunif(steps) / sum(dunif(steps)), + priors_empirical = dbinom(10, 20, steps) / sum(dbinom(10, 20, steps)) + ) + +marginal_likelihood_flat <- + sum(dbinom(nResponders, 100, df$steps) * df$priors_flat) + +marginal_likelihood_empirical <- + sum(dbinom(nResponders, 100, df$steps) * df$priors_empirical) + +df <- + df %>% + mutate( + posteriors_flat = + (likelihoods * priors_flat) / marginal_likelihood_flat, + posteriors_empirical = + (likelihoods * priors_empirical) / marginal_likelihood_empirical + ) +``` + +![Effects of priors on the posterior distribution. The original posterior distribution based on a flat prior is plotted in blue. The prior based on the observation of 10 responders out of 20 people is plotted in the dotted black line, and the posterior using this prior is plotted in red.](img/file70.png) + +图 11.4 先验对后验分布的影响。基于平坦先验的原始后验分布用蓝色绘制。根据对 20 人中 10 名反应者的观察,先验者被画成黑色虚线,后验者被画成红色。 + +注意,可能性和边际可能性并没有改变——只有先前的改变。手术前改变的效果是将后路拉近新手术前的质量,中心为 0.5。 + +现在,让我们看看如果我们以一个更强大的先验信念来进行分析会发生什么。假设之前的研究没有观察到 20 人中有 10 人有反应,而是测试了 500 人,发现 250 人有反应。原则上,这应该给我们一个更强大的先验,正如我们在图[11.5](#fig:strongPrior)中所看到的,这就是发生的事情:先验的集中度要高出 0.5 左右,后验的集中度也更接近先验。一般的观点是贝叶斯推理将先验信息和似然信息结合起来,并对每一种推理的相对强度进行加权。 + +```r +# compute likelihoods for data under all values of p(heads) using strong prior. + +df <- + df %>% + mutate( + priors_strong = dbinom(250, 500, steps) / sum(dbinom(250, 500, steps)) + ) + +marginal_likelihood_strong <- + sum(dbinom(nResponders, 100, df$steps) * df$priors_strong) + +df <- + df %>% + mutate( + posteriors_strongprior = (likelihoods * priors_strong) / marginal_likelihood_strong + ) +``` + +![Effects of the strength of the prior on the posterior distribution. The blue line shows the posterior obtained using the prior based on 50 heads out of 100 people. The dotted black line shows the prior based on 250 heads out of 500 flips, and the red line shows the posterior based on that prior.](img/file71.png) + +图 11.5:前向强度对后向分布的影响。蓝线显示了 100 人中 50 个人头使用先验图获得的后验图。虚线黑线显示的是 500 次翻转中 250 个头部的先验图像,红线显示的是基于先验图像的后验图像。 + +这个例子也突出了贝叶斯分析的顺序性——一个分析的后验可以成为下一个分析的前验。 + +最后,重要的是要认识到,如果先验足够强,它们可以完全压倒数据。假设你有一个绝对先验,它![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)等于或大于 0.8,这样你就把所有其他值的先验概率设置为零。如果我们计算后验,会发生什么? + +```r +# compute likelihoods for data under all values of p(respond) using absolute prior. +df <- + df %>% + mutate( + priors_absolute = array(data = 0, dim = length(steps)), + priors_absolute = if_else( + steps >= 0.8, + 1, priors_absolute + ), + priors_absolute = priors_absolute / sum(priors_absolute) + ) + +marginal_likelihood_absolute <- + sum(dbinom(nResponders, 100, df$steps) * df$priors_absolute) + +df <- + df %>% + mutate( + posteriors_absolute = + (likelihoods * priors_absolute) / marginal_likelihood_absolute + ) +``` + +![Effects of the strength of the prior on the posterior distribution. The blue line shows the posterior obtained using an absolute prior which states that p(respond) is 0.8 or greater. The prior is shown in the dotted black line.](img/file72.png) + +图 11.6:前向强度对后向分布的影响。蓝线表示使用绝对先验得到的后验值,表示 P(响应)大于等于 0.8。前面的内容显示在黑色虚线中。 + +在图[11.6](#fig:absolutePrior)中,我们发现,在先前设置为零的任何值的后面都存在零密度-数据被绝对先前覆盖。 + +## 11.5 选择优先权 + +先验对结果推断的影响是贝叶斯统计中最具争议的方面。有很多种方法可以选择一个人的先验,这(如我们上面所看到的)会影响结果的推论。_ 非形成性先验 _ 试图尽可能少地偏倚产生的后验,正如我们在上述均匀先验的例子中看到的。使用 _ 弱信息先验 _(或 _ 默认先验 _)也很常见,这只会对结果产生很小的偏差。例如,如果我们使用基于两个硬币翻转中一个头的二项式分布,那么前面的硬币将集中在 0.5 左右,但相当平坦,只稍微偏向后面的硬币。 + +也可以根据科学文献或现有数据使用先验,我们称之为 _ 经验先验 _。然而,总的来说,我们将坚持使用不具形成性/信息不足的先验,因为它们对偏向我们的结果提出的关注最少。一般来说,使用多个合理先验来尝试任何贝叶斯分析都是一个好主意,并确保结果不会在基于先验的重要方面发生变化。 + +## 11.6 贝叶斯假设检验 + +在学习了如何执行贝叶斯估计之后,我们现在转向使用贝叶斯方法进行假设检验。假设有两位政治家对公众是否支持死刑持不同的看法。史密斯参议员认为只有 40%的人支持死刑,而琼斯参议员认为 60%的人支持死刑。他们安排了一个民意测验来测试这一点,随机抽取 1000 人,询问他们是否支持死刑。调查结果显示,在接受调查的样本中,490 人支持死刑。基于这些数据,我们想知道:这些数据支持一位参议员对另一位参议员的主张吗?我们可以使用一个名为[贝叶斯因子](https://bayesfactor.blogspot.com/2014/02/the-bayesfactor-package-this-blog-is.html)的概念来测试这一点。 + +# + +## 11.6.1 贝叶斯因子 + +贝叶斯因子表征了两种不同假设下数据的相对似然性。定义如下: + +![](img/fcaf56f4409db92cbad0bc0b7a778d4a.jpg) + +对于两个假设![](img/31f022bcc9b435f1bfa0f95e0e2e285f.jpg)和![](img/2f753734e201315b67e17379e653910b.jpg)。对于我们的两位参议员,我们知道如何使用二项分布计算每个假设下数据的可能性。我们将把史密斯参议员作为分子,琼斯参议员作为分母,这样一个大于一的值将为史密斯参议员反映出更多的证据,而一个小于一的值将为琼斯参议员反映出更多的证据。 + +```r +# compute Bayes factor for Smith vs. Jones + +bf <- + dbinom( + x = 490, + size = 1000, + prob = 0.4 #Smith's hypothesis + ) / dbinom( + x = 490, + size = 1000, + prob = 0.6 #Jones' hypothesis + ) + +sprintf("Bayes factor = %0.2f", bf) +``` + +```r +## [1] "Bayes factor = 3325.26" +``` + +这个数字提供了数据提供的关于两个假设的证据的度量——在本例中,它告诉我们数据支持史密斯参议员的力度是他们支持琼斯参议员的 3000 倍。 + +# + +## 11.6.2 统计假设的贝叶斯因子 + +在前一个例子中,我们有来自每个参议员的具体预测,这些预测的可能性我们可以用二项分布来量化。然而,在实际数据分析中,我们通常必须处理参数的不确定性,这会使贝叶斯因子复杂化。然而,作为交换,我们获得了量化相对数量的证据的能力,支持无效假设与替代假设。 + +假设我们是一名医学研究人员,正在进行糖尿病治疗的临床试验,我们希望知道与安慰剂相比,某种药物是否能降低血糖。我们招募了一组志愿者,将他们随机分配到药物组或安慰剂组,并在给药或安慰剂期间测量各组血红蛋白 A1c(血糖水平的一个标记)的变化。我们想知道的是:药物和安慰剂之间有区别吗? + +首先,让我们生成一些数据,并使用空假设测试对其进行分析(参见图[11.7](#fig:bayesTesting))。 + +```r +# create simulated data for drug trial example + +set.seed(123456) +nsubs <- 40 +effect_size <- 0.1 + +# randomize indiviuals to drug (1) or placebo (0) +drugDf <- + tibble( + group = as.integer(runif(nsubs) > 0.5) + ) %>% + mutate( + hbchange = rnorm(nsubs) - group * effect_size + ) +``` + +![Box plots showing data for drug and placebo groups.](img/file73.png) + +图 11.7 显示药物和安慰剂组数据的方框图。 + +让我们进行一个独立的样本 t 检验,这表明两组之间存在显著差异: + +```r +# compute t-test for drug example +drugTT <- t.test(hbchange ~ group, alternative = "greater", data = drugDf) +print(drugTT) +``` + +```r +## +## Welch Two Sample t-test +## +## data: hbchange by group +## t = 2, df = 40, p-value = 0.03 +## alternative hypothesis: true difference in means is greater than 0 +## 95 percent confidence interval: +## 0.096 Inf +## sample estimates: +## mean in group 0 mean in group 1 +## 0.12 -0.48 +``` + +这个测试告诉我们,两组之间存在显著的差异,但是它并不能量化证据支持无效假设和替代假设的强度。为了测量这一点,我们可以使用 r 中 bayes factor 包中的`ttestBF`函数计算贝叶斯因子: + +```r +# compute Bayes factor for drug data +bf_drug <- ttestBF( + formula = hbchange ~ group, data = drugDf, + nullInterval = c(0, Inf) +) + +bf_drug +``` + +```r +## Bayes factor analysis +## -------------- +## [1] Alt., r=0.707 0 -| 结果 | 数 | -| --- | --- | -| 改进 | 64 个 | -| 没有改善 | 36 岁 | - -# - -## 11.4.3 计算可能性 - -我们可以使用 r 中的`dbinom()`函数计算有效性参数的任何特定值下的数据的可能性。在图[11.1](#fig:like2)中,您可以看到响应器数量对![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)几个不同值的可能性曲线。从这一点来看,我们观察到的数据在![](img/7ce19d5535bbf697999957a6831830c7.jpg)假设下的可能性相对较大,在![](img/52fe760c55a8b94c6345c1ba173d254d.jpg)假设下的可能性相对较小,在![](img/565101aba21de92eb8f6077836e5144e.jpg)假设下的可能性相对较小。贝叶斯推理的一个基本思想是,我们将试图找到我们感兴趣的参数的值,这使得数据最有可能,同时也考虑到我们的先验知识。 - -![Likelihood of each possible number of responders under several different hypotheses (p(respond)=0.5 (red), 0.7 (green), 0.3 (black). Observed value shown in blue.](img/file67.png) - -图 11.1 几个不同假设下每个可能数量的应答者的可能性(P(应答)=0.5(红色),0.7(绿色),0.3(黑色)。观察值以蓝色显示。 - -# - -## 11.4.4 计算边际可能性 - -除了不同假设下数据的可能性外,我们还需要知道数据的总体可能性,并结合所有假设(即边际可能性)。这种边际可能性主要是重要的,因为它有助于确保后验值是真实概率。在这种情况下,我们使用一组离散的可能参数值使得计算边际似然变得容易,因为我们只需计算每个假设下每个参数值的似然,并将它们相加。 - -```r -# compute marginal likelihood -likeDf <- - likeDf %>% - mutate(uniform_prior = array(1 / n())) - -# multiply each likelihood by prior and add them up -marginal_likelihood <- - sum( - dbinom( - x = nResponders, # the number who responded to the drug - size = 100, # the number tested - likeDf$presp # the likelihood of each response - ) * likeDf$uniform_prior - ) - -sprintf("marginal likelihood = %0.4f", marginal_likelihood) -``` - -```r -## [1] "marginal likelihood = 0.0100" -``` - -# - -## 11.4.5 计算后部 - -我们现在有了所有需要计算![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)所有可能值的后验概率分布的部分,如图[11.2](#fig:posteriorDist)所示。 - -```r -# Create data for use in figure -bayesDf <- - tibble( - steps = seq(from = 0.01, to = 0.99, by = 0.01) - ) %>% - mutate( - likelihoods = dbinom( - x = nResponders, - size = 100, - prob = steps - ), - priors = dunif(steps) / length(steps), - posteriors = (likelihoods * priors) / marginal_likelihood - ) -``` - -![Posterior probability distribution plotted in blue against uniform prior distribution (dotted black line).](img/file68.png) - -图 11.2 蓝色后验概率分布图与均匀前验概率分布图(黑色虚线)。 - -# - -## 11.4.6 最大后验概率(MAP)估计 - -根据我们的数据,我们希望获得样本的估计值![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)。一种方法是找到后验概率最高的![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)值,我们称之为后验概率(map)估计的 _ 最大值。我们可以从[11.2](#fig:posteriorDist)中的数据中找到:_ - -```r -# compute MAP estimate -MAP_estimate <- - bayesDf %>% - arrange(desc(posteriors)) %>% - slice(1) %>% - pull(steps) - -sprintf("MAP estimate = %0.4f", MAP_estimate) -``` - -```r -## [1] "MAP estimate = 0.6400" -``` - -请注意,这只是样本中反应者的比例——这是因为之前的反应是一致的,因此没有影响我们的反应。 - -# - -## 11.4.7 可信区间 - -通常我们想知道的不仅仅是对后位的单一估计,而是一个我们确信后位下降的间隔。我们之前讨论过频繁推理背景下的置信区间概念,您可能还记得,置信区间的解释特别复杂。我们真正想要的是一个区间,在这个区间中,我们确信真正的参数会下降,而贝叶斯统计可以给我们一个这样的区间,我们称之为 _ 可信区间 _。 - -在某些情况下,可信区间可以根据已知的分布用数字 _ 计算,但从后验分布中取样,然后计算样本的分位数更常见。当我们没有一个简单的方法来用数字表示后验分布时,这是特别有用的,在实际的贝叶斯数据分析中经常是这样。_ - -我们将使用一个简单的算法从我们的后验分布中生成样本,该算法被称为[_ 拒绝抽样 _](https://am207.github.io/2017/wiki/rejectionsampling.html)。我们的想法是从一个均匀分布中选择 x 的随机值(在本例中为![](img/cb86d3a73cc424b0260d4020c4b40755.jpg))和 y 的随机值(在本例中为![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)的后验概率)。然后,只有在![](img/9c86ebacc1cbef2bb12c73aeb21d23e9.jpg)—这种情况下,如果随机选择的 y 值小于 y 的实际后验概率,我们才接受样本。图[11.3](#fig:rejectionSampling)显示了使用拒绝抽样的样本的直方图示例,以及使用 th 获得的 95%可信区间。是方法。 - -```r -# Compute credible intervals for example - -nsamples <- 100000 - -# create random uniform variates for x and y -x <- runif(nsamples) -y <- runif(nsamples) - -# create f(x) -fx <- dbinom(x = nResponders, size = 100, prob = x) - -# accept samples where y < f(x) -accept <- which(y < fx) -accepted_samples <- x[accept] - -credible_interval <- quantile(x = accepted_samples, probs = c(0.025, 0.975)) -pander(credible_interval) -``` - - -| 2.5% | 98% | -| --- | --- | -| 0.54 分 | 0.72 分 | - -![Rejection sampling example.The black line shows the density of all possible values of p(respond); the blue lines show the 2.5th and 97.5th percentiles of the distribution, which represent the 95 percent credible interval for the estimate of p(respond).](img/file69.png) - -图 11.3 拒绝抽样示例。黑线表示 P(响应)所有可能值的密度;蓝线表示分布的 2.5%和 97.5%,表示 P(响应)估计的 95%可信区间。 - -这个可信区间的解释更接近于我们希望从置信区间(但不能)中得到的结果:它告诉我们,95%的概率![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)的值介于这两个值之间。重要的是,它表明我们对![](img/7dde591ac08edac3e5ac5c432367acde.jpg)有很高的信心,这意味着该药物似乎有积极的效果。 - -# - -## 11.4.8 不同先验的影响 - -在上一个例子中,我们在之前使用了 _ 平面,这意味着我们没有任何理由相信![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)的任何特定值或多或少是可能的。然而,假设我们是从一些以前的数据开始的:在之前的一项研究中,研究人员测试了 20 个人,发现其中 10 个人的反应是积极的。这将引导我们从先前的信念开始,即治疗对 50%的人有效果。我们可以做与上面相同的计算,但是使用我们以前的研究中的信息来通知我们之前的研究(参见图[11.4](#fig:posteriorDistPrior))。_ - -```r -# compute likelihoods for data under all values of p(heads) -# using a flat or empirical prior. -# here we use the quantized values from .01 to .99 in steps of 0.01 - -df <- - tibble( - steps = seq(from = 0.01, to = 0.99, by = 0.01) - ) %>% - mutate( - likelihoods = dbinom(nResponders, 100, steps), - priors_flat = dunif(steps) / sum(dunif(steps)), - priors_empirical = dbinom(10, 20, steps) / sum(dbinom(10, 20, steps)) - ) - -marginal_likelihood_flat <- - sum(dbinom(nResponders, 100, df$steps) * df$priors_flat) - -marginal_likelihood_empirical <- - sum(dbinom(nResponders, 100, df$steps) * df$priors_empirical) - -df <- - df %>% - mutate( - posteriors_flat = - (likelihoods * priors_flat) / marginal_likelihood_flat, - posteriors_empirical = - (likelihoods * priors_empirical) / marginal_likelihood_empirical - ) -``` - -![Effects of priors on the posterior distribution. The original posterior distribution based on a flat prior is plotted in blue. The prior based on the observation of 10 responders out of 20 people is plotted in the dotted black line, and the posterior using this prior is plotted in red.](img/file70.png) - -图 11.4 先验对后验分布的影响。基于平坦先验的原始后验分布用蓝色绘制。根据对 20 人中 10 名反应者的观察,先验者被画成黑色虚线,后验者被画成红色。 - -注意,可能性和边际可能性并没有改变——只有先前的改变。手术前改变的效果是将后路拉近新手术前的质量,中心为 0.5。 - -现在,让我们看看如果我们以一个更强大的先验信念来进行分析会发生什么。假设之前的研究没有观察到 20 人中有 10 人有反应,而是测试了 500 人,发现 250 人有反应。原则上,这应该给我们一个更强大的先验,正如我们在图[11.5](#fig:strongPrior)中所看到的,这就是发生的事情:先验的集中度要高出 0.5 左右,后验的集中度也更接近先验。一般的观点是贝叶斯推理将先验信息和似然信息结合起来,并对每一种推理的相对强度进行加权。 - -```r -# compute likelihoods for data under all values of p(heads) using strong prior. - -df <- - df %>% - mutate( - priors_strong = dbinom(250, 500, steps) / sum(dbinom(250, 500, steps)) - ) - -marginal_likelihood_strong <- - sum(dbinom(nResponders, 100, df$steps) * df$priors_strong) - -df <- - df %>% - mutate( - posteriors_strongprior = (likelihoods * priors_strong) / marginal_likelihood_strong - ) -``` - -![Effects of the strength of the prior on the posterior distribution. The blue line shows the posterior obtained using the prior based on 50 heads out of 100 people. The dotted black line shows the prior based on 250 heads out of 500 flips, and the red line shows the posterior based on that prior.](img/file71.png) - -图 11.5:前向强度对后向分布的影响。蓝线显示了 100 人中 50 个人头使用先验图获得的后验图。虚线黑线显示的是 500 次翻转中 250 个头部的先验图像,红线显示的是基于先验图像的后验图像。 - -这个例子也突出了贝叶斯分析的顺序性——一个分析的后验可以成为下一个分析的前验。 - -最后,重要的是要认识到,如果先验足够强,它们可以完全压倒数据。假设你有一个绝对先验,它![](img/cb86d3a73cc424b0260d4020c4b40755.jpg)等于或大于 0.8,这样你就把所有其他值的先验概率设置为零。如果我们计算后验,会发生什么? - -```r -# compute likelihoods for data under all values of p(respond) using absolute prior. -df <- - df %>% - mutate( - priors_absolute = array(data = 0, dim = length(steps)), - priors_absolute = if_else( - steps >= 0.8, - 1, priors_absolute - ), - priors_absolute = priors_absolute / sum(priors_absolute) - ) - -marginal_likelihood_absolute <- - sum(dbinom(nResponders, 100, df$steps) * df$priors_absolute) - -df <- - df %>% - mutate( - posteriors_absolute = - (likelihoods * priors_absolute) / marginal_likelihood_absolute - ) -``` - -![Effects of the strength of the prior on the posterior distribution. The blue line shows the posterior obtained using an absolute prior which states that p(respond) is 0.8 or greater. The prior is shown in the dotted black line.](img/file72.png) - -图 11.6:前向强度对后向分布的影响。蓝线表示使用绝对先验得到的后验值,表示 P(响应)大于等于 0.8。前面的内容显示在黑色虚线中。 - -在图[11.6](#fig:absolutePrior)中,我们发现,在先前设置为零的任何值的后面都存在零密度-数据被绝对先前覆盖。 - -## 11.5 选择优先权 - -先验对结果推断的影响是贝叶斯统计中最具争议的方面。有很多种方法可以选择一个人的先验,这(如我们上面所看到的)会影响结果的推论。_ 非形成性先验 _ 试图尽可能少地偏倚产生的后验,正如我们在上述均匀先验的例子中看到的。使用 _ 弱信息先验 _(或 _ 默认先验 _)也很常见,这只会对结果产生很小的偏差。例如,如果我们使用基于两个硬币翻转中一个头的二项式分布,那么前面的硬币将集中在 0.5 左右,但相当平坦,只稍微偏向后面的硬币。 - -也可以根据科学文献或现有数据使用先验,我们称之为 _ 经验先验 _。然而,总的来说,我们将坚持使用不具形成性/信息不足的先验,因为它们对偏向我们的结果提出的关注最少。一般来说,使用多个合理先验来尝试任何贝叶斯分析都是一个好主意,并确保结果不会在基于先验的重要方面发生变化。 - -## 11.6 贝叶斯假设检验 - -在学习了如何执行贝叶斯估计之后,我们现在转向使用贝叶斯方法进行假设检验。假设有两位政治家对公众是否支持死刑持不同的看法。史密斯参议员认为只有 40%的人支持死刑,而琼斯参议员认为 60%的人支持死刑。他们安排了一个民意测验来测试这一点,随机抽取 1000 人,询问他们是否支持死刑。调查结果显示,在接受调查的样本中,490 人支持死刑。基于这些数据,我们想知道:这些数据支持一位参议员对另一位参议员的主张吗?我们可以使用一个名为[贝叶斯因子](https://bayesfactor.blogspot.com/2014/02/the-bayesfactor-package-this-blog-is.html)的概念来测试这一点。 - -# - -## 11.6.1 贝叶斯因子 - -贝叶斯因子表征了两种不同假设下数据的相对似然性。定义如下: - -![](img/fcaf56f4409db92cbad0bc0b7a778d4a.jpg) - -对于两个假设![](img/31f022bcc9b435f1bfa0f95e0e2e285f.jpg)和![](img/2f753734e201315b67e17379e653910b.jpg)。对于我们的两位参议员,我们知道如何使用二项分布计算每个假设下数据的可能性。我们将把史密斯参议员作为分子,琼斯参议员作为分母,这样一个大于一的值将为史密斯参议员反映出更多的证据,而一个小于一的值将为琼斯参议员反映出更多的证据。 - -```r -# compute Bayes factor for Smith vs. Jones - -bf <- - dbinom( - x = 490, - size = 1000, - prob = 0.4 #Smith's hypothesis - ) / dbinom( - x = 490, - size = 1000, - prob = 0.6 #Jones' hypothesis - ) - -sprintf("Bayes factor = %0.2f", bf) -``` - -```r -## [1] "Bayes factor = 3325.26" -``` - -这个数字提供了数据提供的关于两个假设的证据的度量——在本例中,它告诉我们数据支持史密斯参议员的力度是他们支持琼斯参议员的 3000 倍。 - -# - -## 11.6.2 统计假设的贝叶斯因子 - -在前一个例子中,我们有来自每个参议员的具体预测,这些预测的可能性我们可以用二项分布来量化。然而,在实际数据分析中,我们通常必须处理参数的不确定性,这会使贝叶斯因子复杂化。然而,作为交换,我们获得了量化相对数量的证据的能力,支持无效假设与替代假设。 - -假设我们是一名医学研究人员,正在进行糖尿病治疗的临床试验,我们希望知道与安慰剂相比,某种药物是否能降低血糖。我们招募了一组志愿者,将他们随机分配到药物组或安慰剂组,并在给药或安慰剂期间测量各组血红蛋白 A1c(血糖水平的一个标记)的变化。我们想知道的是:药物和安慰剂之间有区别吗? - -首先,让我们生成一些数据,并使用空假设测试对其进行分析(参见图[11.7](#fig:bayesTesting))。 - -```r -# create simulated data for drug trial example - -set.seed(123456) -nsubs <- 40 -effect_size <- 0.1 - -# randomize indiviuals to drug (1) or placebo (0) -drugDf <- - tibble( - group = as.integer(runif(nsubs) > 0.5) - ) %>% - mutate( - hbchange = rnorm(nsubs) - group * effect_size - ) -``` - -![Box plots showing data for drug and placebo groups.](img/file73.png) - -图 11.7 显示药物和安慰剂组数据的方框图。 - -让我们进行一个独立的样本 t 检验,这表明两组之间存在显著差异: - -```r -# compute t-test for drug example -drugTT <- t.test(hbchange ~ group, alternative = "greater", data = drugDf) -print(drugTT) -``` - -```r -## -## Welch Two Sample t-test -## -## data: hbchange by group -## t = 2, df = 40, p-value = 0.03 -## alternative hypothesis: true difference in means is greater than 0 -## 95 percent confidence interval: -## 0.096 Inf -## sample estimates: -## mean in group 0 mean in group 1 -## 0.12 -0.48 -``` - -这个测试告诉我们,两组之间存在显著的差异,但是它并不能量化证据支持无效假设和替代假设的强度。为了测量这一点,我们可以使用 r 中 bayes factor 包中的`ttestBF`函数计算贝叶斯因子: - -```r -# compute Bayes factor for drug data -bf_drug <- ttestBF( - formula = hbchange ~ group, data = drugDf, - nullInterval = c(0, Inf) -) - -bf_drug -``` - -```r -## Bayes factor analysis -## -------------- -## [1] Alt., r=0.707 0 +| 糖果型 | 计数 | +| --- | --- | +| 巧克力 | 30 个 | +| 甘草 | 33 | +| 胶球 | 37 岁 | + +因为我更喜欢巧克力,而不是甘草或树胶球,我觉得有点被撕了。我想知道的是:如果每种糖果的真实概率是每种糖果平均 1/3 的比例,那么这种计数的可能性有多大? + +## 12.2 皮尔逊卡方检验 + +皮尔逊卡方检验为我们提供了一种方法来检验观察到的计数数据是否与定义零假设的某些特定预期值不同: + +![](img/a39dfdf63e525b1d15f99c58b2ae7a2e.jpg) + +在我们的糖果例子中,无效假设是每种糖果的比例是相等的。我们可以计算我们观察到的糖果计数的卡方统计,如下所示: + +```r +# compute chi-squared statistic + +nullExpectation <- c(1 / 3, 1 / 3, 1 / 3) * sum(candyDf$count) + +chisqVal <- + sum( + ((candyDf$count - nullExpectation)**2) / nullExpectation + ) +``` + +这个分析的卡方统计结果是 0.74,这本身是不可解释的,因为它取决于加在一起的不同值的数量。然而,我们可以利用这样一个事实:卡方统计量是根据零假设下的特定分布分布分布的,这就是所谓的 _ 卡方 _ 分布。这种分布被定义为一组标准正态随机变量的平方和;它有若干自由度,等于被加在一起的变量数。分布的形状取决于自由度的数量。图[12.1](#fig:chisqDist)显示了几种不同自由度的分布示例。 + +![Examples of the chi-squared distribution for various degrees of freedom.](img/file74.png) + +图 12.1 不同自由度的卡方分布示例。 + +让我们通过模拟来验证卡方分布是否准确地描述了一组标准正态随机变量的平方和。 + +```r +# simulate 50,000 sums of 8 standard normal random variables and compare +# to theoretical chi-squared distribution + +# create a matrix with 50k columns of 8 rows of squared normal random variables +d <- replicate(50000, rnorm(n = 8, mean = 0, sd = 1)**2) +# sum each column of 8 variables +dMean <- apply(d, 2, sum) + +# create a data frame of the theoretical chi-square distribution +# with 8 degrees of freedom +csDf <- + data.frame(x = seq(0.01, 30, 0.01)) %>% + mutate(chisq = dchisq(x, 8)) +``` + +图[12.2](#fig:chisqSim)显示,理论分布与重复将一组随机正态变量的平方相加的模拟结果非常吻合。 + +![Simulation of sum of squared random normal variables. The histogram is based on the sum of squares of 50,000 sets of 8 random normal variables; the blue line shows the values of the theoretical chi-squared distribution with 8 degrees of freedom.](img/file75.png) + +图 12.2 平方随机正态变量和的模拟。柱状图是基于 5 万组 8 个随机正态变量的平方和;蓝线显示了 8 个自由度下理论卡方分布的值。 + +对于糖果的例子,我们可以计算在所有糖果的相同频率的零假设下,我们观察到的卡方值为 0.74 的可能性。我们使用自由度等于 k-1(其中 k=类别数)的卡方分布,因为我们在计算平均值以生成预期值时失去了一个自由度。 + +```r +pval <- pchisq(chisqVal, df = 2, lower.tail = FALSE) #df = degrees of freedom +sprintf("p-value = %0.3f", pval) +``` + +```r +## [1] "p-value = 0.691" +``` + +这表明,观察到的糖果数量并不是特别令人惊讶的,基于印刷在糖果袋上的比例,我们不会拒绝等比的无效假设。 + +## 12.3 应急表及双向试验 + +我们经常使用卡方检验的另一种方法是询问两个分类变量是否相互关联。作为一个更现实的例子,让我们来考虑一个问题,当一个黑人司机被警察拦下时,他们是否比一个白人司机更有可能被搜查,斯坦福公开警务项目([https://open policing.stanford.edu/](https://openpolicing.stanford.edu/))研究了这个问题,并提供了我们可以用来分析问题的数据。我们将使用来自康涅狄格州的数据,因为它们相当小。首先清理这些数据,以删除所有不必要的数据(参见 code/process_ct_data.py)。 + +```r +# load police stop data +stopData <- + read_csv("data/CT_data_cleaned.csv") %>% + rename(searched = search_conducted) +``` + +表示分类分析数据的标准方法是通过 _ 列联表 _,列联表显示了属于每个变量值的每个可能组合的观测值的数量或比例。 + +让我们计算一下警察搜索数据的应急表: + +```r +# compute and print two-way contingency table +summaryDf2way <- + stopData %>% + count(searched, driver_race) %>% + arrange(driver_race, searched) + +summaryContingencyTable <- + summaryDf2way %>% + spread(driver_race, n) + +pander(summaryContingencyTable) +``` + + +| 已搜索 | 黑色 | 白色 | +| --- | --- | --- | +| 错误的 | 36244 个 | 239241 个 | +| 真的 | 1219 年 | 3108 个 | + +使用比例而不是原始数字查看应急表也很有用,因为它们更容易在视觉上进行比较。 + +```r +# Compute and print contingency table using proportions +# rather than raw frequencies +summaryContingencyTableProportion <- + summaryContingencyTable %>% + mutate( + Black = Black / nrow(stopData), #count of Black individuals searched / total searched + White = White / nrow(stopData) + ) +pander(summaryContingencyTableProportion, round = 4) +``` + + +| searched | Black | White | +| --- | --- | --- | +| FALSE | 0.1295 年 | 0.855 个 | +| TRUE | 0.0044 美元 | 0.0111 个 | + +Pearson 卡方检验允许我们检验观察到的频率是否与预期频率不同,因此我们需要确定如果搜索和种族不相关,我们期望在每个细胞中出现的频率,我们可以定义为 _ 独立。_ 请记住,如果 x 和 y 是独立的,那么: + +![](img/ae00b41c7d126a5646eb9e06bf53e695.jpg) + +也就是说,零独立假设下的联合概率仅仅是每个变量的 _ 边际 _ 概率的乘积。边际概率只是每一个事件发生的概率,与其他事件无关。我们可以计算这些边际概率,然后将它们相乘,得到独立状态下的预期比例。 + +| | 黑色 | 白色 | | +| --- | --- | --- | --- | +| 未搜索 | P(ns)*P(b) | P(ns)*P(w) | P(纳秒) | +| 已搜索 | P(S)*P(B) | P(S)*P(W) | P(S) | +| | P(B) | P(宽) | | + +我们可以使用称为“外积”的线性代数技巧(通过`outer()`函数)来轻松计算。 + +```r +# first, compute the marginal probabilities + +# probability of being each race +summaryDfRace <- + stopData %>% + count(driver_race) %>% #count the number of drivers of each race + mutate( + prop = n / sum(n) #compute the proportion of each race out of all drivers + ) + +# probability of being searched +summaryDfStop <- + stopData %>% + count(searched) %>% #count the number of searched vs. not searched + mutate( + prop = n / sum(n) # compute proportion of each outcome out all traffic stops + ) +``` + +```r +# second, multiply outer product by n (all stops) to compute expected frequencies +expected <- outer(summaryDfRace$prop, summaryDfStop$prop) * nrow(stopData) + +# create a data frame of expected frequencies for each race +expectedDf <- + data.frame(expected, driverRace = c("Black", "White")) %>% + rename( + NotSearched = X1, + Searched = X2 + ) + +# tidy the data frame +expectedDfTidy <- + gather(expectedDf, searched, n, -driverRace) %>% + arrange(driverRace, searched) +``` + +```r +# third, add expected frequencies to the original summary table +# and fourth, compute the standardized squared difference between +# the observed and expected frequences + +summaryDf2way <- + summaryDf2way %>% + mutate(expected = expectedDfTidy$n) + +summaryDf2way <- + summaryDf2way %>% + mutate(stdSqDiff = (n - expected)**2 / expected) + +pander(summaryDf2way) +``` + + +| searched | 车手比赛 | N 号 | 预期 | 标准平方差 | +| --- | --- | --- | --- | --- | +| FALSE | 黑色 | 36244 | 36883.67 个 | 2009 年 11 月 | +| TRUE | Black | 1219 | 579.33 条 | 第 706.31 条 | +| FALSE | 白色 | 239241 | 238601.3 条 | 1.71 条 | +| TRUE | White | 3108 | 3747.67 美元 | 109.18 条 | + +```r +# finally, compute chi-squared statistic by +# summing the standardized squared differences +chisq <- sum(summaryDf2way$stdSqDiff) +sprintf("Chi-squared value = %0.2f", chisq) +``` + +```r +## [1] "Chi-squared value = 828.30" +``` + +在计算了卡方统计之后,我们现在需要将其与卡方分布进行比较,以确定它与我们在无效假设下的期望相比有多极端。这种分布的自由度是![](img/206275e6a74b69f71d35c279b3e2d1c0.jpg)——因此,对于类似于这里的 2x2 表,![](img/ba8975aad6841ab43375c0463cf596e7.jpg)。这里的直觉是计算预期频率需要我们使用三个值:观察总数和两个变量的边际概率。因此,一旦计算出这些值,就只有一个数字可以自由变化,因此有一个自由度。鉴于此,我们可以计算卡方统计的 p 值: + +```r +pval <- pchisq(chisq, df = 1, lower.tail = FALSE) +sprintf("p-value = %e", pval) +``` + +```r +## [1] "p-value = 3.795669e-182" +``` + +![](img/0a218a4dadec40dff9f8d2264a3c9d39.jpg)的 p 值非常小,表明如果种族和警察搜查之间真的没有关系,观察到的数据就不太可能,因此我们应该拒绝独立性的无效假设。 + +我们还可以使用 r 中的`chisq.test()`函数轻松执行此测试: + +```r +# first need to rearrange the data into a 2x2 table +summaryDf2wayTable <- + summaryDf2way %>% + dplyr::select(-expected, -stdSqDiff) %>% + spread(searched, n) %>% + dplyr::select(-driver_race) + +chisqTestResult <- chisq.test(summaryDf2wayTable, 1, correct = FALSE) +chisqTestResult +``` + +```r +## +## Pearson's Chi-squared test +## +## data: summaryDf2wayTable +## X-squared = 800, df = 1, p-value <2e-16 +``` + +## 12.4 标准化残差 + +当我们发现卡方检验的显著效果时,这告诉我们,在无效假设下,数据是不可能的,但它并没有告诉我们 _ 数据有什么不同。为了更深入地了解数据与我们在零假设下预期的差异,我们可以检查模型的残差,该残差反映了数据(即观察到的频率)与每个单元中模型的偏差(即预期频率)。而不是查看原始残差(仅根据数据中观察的数量而变化),更常见的是查看其他 _ 标准化残差 _,其计算如下:_ + +![](img/fc6dfc834654c8a6d8b2323c1bd6b480.jpg) + +其中![](img/31df9c730e19ca29b59dce64b99d98c1.jpg)和![](img/d8fdd0e28cfb03738fc5227885ee035a.jpg)分别是行和列的索引。我们可以为警察局的数据计算这些数据: + +```r +# compute standardized residuals +summaryDf2way <- + summaryDf2way %>% + mutate(stdRes = (n - expected)/sqrt(expected)) + +pander(summaryDf2way) +``` + + +| 已搜索 | 车手比赛 | N 号 | 预期 | 标准平方差 | 标准普尔 | +| --- | --- | --- | --- | --- | --- | +| 错误的 | 黑色 | 36244 个 | 36883.67 个 | 2009 年 11 月 | -3.33 条 | +| 真的 | Black | 1219 年 | 579.33 条 | 第 706.31 条 | 26.58 美元 | +| FALSE | 白色 | 239241 个 | 238601.3 条 | 1.71 条 | 1.31 条 | +| TRUE | White | 3108 个 | 3747.67 美元 | 109.18 条 | -10.45 美元 | + +这些标准化的残差可以解释为 z 分数——在这种情况下,我们看到,基于独立性,对黑人个体的搜索次数大大高于预期,而对白人个体的搜索次数大大低于预期。这为我们提供了解释显著的卡方结果所需的上下文。 + +## 12.5 优势比 + +我们还可以使用前面介绍的优势比在应急表中表示不同结果的相对可能性,以便更好地了解影响的大小。首先,我们表示每一场比赛被阻止的几率: + +![](img/e6acd79788a8dbe24193b20151db6a12.jpg) + +![](img/9aa2622d4176179ddfde24206732f146.jpg)![](img/be906c2bfa49b7ba6d831a99b9f47c71.jpg) + +根据这一数据集,优势比显示,黑人和白人驾驶员被搜索的几率要高出 2.59 倍。 + +## 12.6 贝叶斯系数 + +![](img/ed955fccd67d36cab5ec92cfcd8c1742.jpg) + +我们在关于贝叶斯统计的前一章中讨论了贝叶斯因子——你可能记得它代表了两种假设下数据的可能性比:贝叶斯因子在某种程度上类似于 p 值和影响大小,也就是说它们的解释是某种意义上的。t 主观。他们的解释有各种各样的指导方针——这是来自 Kass 和 Raftery(1995)的一个: + +| 高炉 | 解释 | +| --- | --- | +| 1 到 3 | 不值得一提 | +| 3 至 20 | 积极的 | +| 20 至 150 | 坚强的 | +| 150 及以上 | 非常强壮 | + +我们可以使用 BayesFactor 包中的`contingencyTableBF()`函数计算警察搜索数据的 Bayes 因子: + +```r +# compute Bayes factor +# using independent multinomial sampling plan in which row totals (driver race) +# are fixed + +bf <- + contingencyTableBF(as.matrix(summaryDf2wayTable), + sampleType = "indepMulti", + fixedMargin = "cols" +) +bf +``` + +```r +## Bayes factor analysis +## -------------- +## [1] Non-indep. (a=1) : 1.8e+142 ±0% +## +## Against denominator: +## Null, independence, a = 1 +## --- +## Bayes factor type: BFcontingencyTable, independent multinomial +``` + +这表明,在这个数据集中,支持驾驶员种族和警察搜索之间关系的证据非常有力。 + +## 12.7 超出 2 x 2 表的分类分析 + +分类分析也可以应用于应急表,其中每个变量有两个以上的类别。 + +例如,让我们看一下 nhanes 的数据,比较变量 _depressed_,它表示“参与者感到沮丧、沮丧或绝望的自我报告天数”。此变量编码为`None`、`Several`或`Most`。让我们测试这个变量是否与 _sleeptrouble_ 变量相关,这个变量报告个人是否向医生报告了睡眠问题。 + +```r +# summarize depression as a function of sleep trouble +depressedSleepTrouble <- + NHANES_adult %>% + drop_na(SleepTrouble, Depressed) %>% + count(SleepTrouble, Depressed) %>% + arrange(SleepTrouble, Depressed) + +depressedSleepTroubleTable <- + depressedSleepTrouble %>% + spread(SleepTrouble, n) %>% + rename( + NoSleepTrouble = No, + YesSleepTrouble = Yes + ) + +pander(depressedSleepTroubleTable) +``` + + +| 沮丧的 | 无阻力 | 是的,可重复 | +| --- | --- | --- | +| 无 | 2614 个 | 676 个 | +| 几个 | 418 个 | 249 个 | +| 大多数 | 138 个 | 145 个 | + +简单地看一下这些数据,我们就可以知道这两个变量之间可能存在某种关系;特别是,尽管睡眠问题患者的总数比没有睡眠问题的患者要少很多,但对于大多数时间都处于抑郁状态的患者来说,睡眠问题患者的数量更大。比没有的要水。我们可以直接使用卡方检验对其进行量化;如果我们的数据框只包含两个变量,那么我们可以简单地将数据框作为参数提供给`chisq.test()`函数: + +```r +# need to remove the column with the label names +depressedSleepTroubleTable <- + depressedSleepTroubleTable %>% + dplyr::select(-Depressed) + +depressedSleepChisq <- chisq.test(depressedSleepTroubleTable) +depressedSleepChisq +``` + +```r +## +## Pearson's Chi-squared test +## +## data: depressedSleepTroubleTable +## X-squared = 200, df = 2, p-value <2e-16 +``` + +这项测试表明,抑郁和睡眠问题之间有很强的关系。我们还可以计算贝叶斯因子来量化有利于替代假设的证据的强度: + +```r +# compute bayes factor, using a joint multinomial sampling plan +bf <- + contingencyTableBF( + as.matrix(depressedSleepTroubleTable), + sampleType = "jointMulti" + ) +bf +``` + +```r +## Bayes factor analysis +## -------------- +## [1] Non-indep. (a=1) : 1.8e+35 ±0% +## +## Against denominator: +## Null, independence, a = 1 +## --- +## Bayes factor type: BFcontingencyTable, joint multinomial +``` + +在这里,我们看到贝叶斯系数非常大,这表明支持抑郁和睡眠问题之间关系的证据非常有力。 + +## 12.8 注意辛普森悖论 + +上述应急表是对大量观察结果的总结,但有时会产生误导。让我们以棒球为例。下表显示了 1995-1997 年间德里克·杰特和大卫·贾斯汀的击球数据(击数/击数和平均击球数): + +| 玩家 | 1995 年 | | 1996 年 | | 1997 年 | | 合并 | | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 基特 | 12 月 48 日 | 0.250 | 183/582 年 | .314 条 | 190/654 年 | .291 条 | 385/1284 年 | **.300** | +| 大卫·正义 | 104/411 号 | **.253** | 45/140 分 | **.321** | 163/495 年 | **.329** | 312/1046 年 | .298 条 | + +如果你仔细观察,你会发现有些奇怪的事情正在发生:在每一年,正义比杰特有一个更高的击球平均值,但当我们结合所有三年的数据,杰特的平均值实际上高于正义!这是一个被称为 _ 辛普森悖论 _ 的现象的例子,在这种现象中,组合数据集中的模式可能不存在于数据的任何子集中。当有另一个变量可能在不同的子集之间发生变化时,就会发生这种情况——在这种情况下,AT 蝙蝠的数量随着时间的推移而变化,1995 年司法部的击球次数更多(击球平均数较低时)。我们把它称为一个潜伏变量(htg2),每当我们检查分类数据时,注意这些变量总是很重要的。 \ No newline at end of file diff --git a/docs/12.x2.md b/docs/12.x2.md deleted file mode 100644 index 571ccef8f4c2f1491379a0c74ed812ff1998f0c0..0000000000000000000000000000000000000000 --- a/docs/12.x2.md +++ /dev/null @@ -1,430 +0,0 @@ -# 12 分类关系建模 - -到目前为止,我们已经讨论了统计建模和假设检验的一般概念,并将它们应用到一些简单的分析中。在本章中,我们将重点介绍 _ 分类 _ 关系的建模,通过建模,我们可以表示在名义(有时是序数)尺度上测量的变量之间的关系。这些数据通常用计数来表示;也就是说,对于变量的每个值(或多个变量的值的组合),有多少观测值取这个值?例如,当我们计算每个专业有多少人在我们班上时,我们将根据数据拟合一个分类模型。 - -## 12.1 示例:糖果颜色 - -假设我买了一袋 100 颗糖果,上面写着有 1/3 巧克力、1/3 甘草和 1/3 胶球。当我数包里的糖果时,我们得到以下数字: - -```r -candyDf <- - tibble( - candyType = c("chocolate", "licorice", "gumball"), - count = c(30, 33, 37) - ) -pander(candyDf) -``` - - -| 糖果型 | 计数 | -| --- | --- | -| 巧克力 | 30 个 | -| 甘草 | 33 | -| 胶球 | 37 岁 | - -因为我更喜欢巧克力,而不是甘草或树胶球,我觉得有点被撕了。我想知道的是:如果每种糖果的真实概率是每种糖果平均 1/3 的比例,那么这种计数的可能性有多大? - -## 12.2 皮尔逊卡方检验 - -皮尔逊卡方检验为我们提供了一种方法来检验观察到的计数数据是否与定义零假设的某些特定预期值不同: - -![](img/a39dfdf63e525b1d15f99c58b2ae7a2e.jpg) - -在我们的糖果例子中,无效假设是每种糖果的比例是相等的。我们可以计算我们观察到的糖果计数的卡方统计,如下所示: - -```r -# compute chi-squared statistic - -nullExpectation <- c(1 / 3, 1 / 3, 1 / 3) * sum(candyDf$count) - -chisqVal <- - sum( - ((candyDf$count - nullExpectation)**2) / nullExpectation - ) -``` - -这个分析的卡方统计结果是 0.74,这本身是不可解释的,因为它取决于加在一起的不同值的数量。然而,我们可以利用这样一个事实:卡方统计量是根据零假设下的特定分布分布分布的,这就是所谓的 _ 卡方 _ 分布。这种分布被定义为一组标准正态随机变量的平方和;它有若干自由度,等于被加在一起的变量数。分布的形状取决于自由度的数量。图[12.1](#fig:chisqDist)显示了几种不同自由度的分布示例。 - -![Examples of the chi-squared distribution for various degrees of freedom.](img/file74.png) - -图 12.1 不同自由度的卡方分布示例。 - -让我们通过模拟来验证卡方分布是否准确地描述了一组标准正态随机变量的平方和。 - -```r -# simulate 50,000 sums of 8 standard normal random variables and compare -# to theoretical chi-squared distribution - -# create a matrix with 50k columns of 8 rows of squared normal random variables -d <- replicate(50000, rnorm(n = 8, mean = 0, sd = 1)**2) -# sum each column of 8 variables -dMean <- apply(d, 2, sum) - -# create a data frame of the theoretical chi-square distribution -# with 8 degrees of freedom -csDf <- - data.frame(x = seq(0.01, 30, 0.01)) %>% - mutate(chisq = dchisq(x, 8)) -``` - -图[12.2](#fig:chisqSim)显示,理论分布与重复将一组随机正态变量的平方相加的模拟结果非常吻合。 - -![Simulation of sum of squared random normal variables. The histogram is based on the sum of squares of 50,000 sets of 8 random normal variables; the blue line shows the values of the theoretical chi-squared distribution with 8 degrees of freedom.](img/file75.png) - -图 12.2 平方随机正态变量和的模拟。柱状图是基于 5 万组 8 个随机正态变量的平方和;蓝线显示了 8 个自由度下理论卡方分布的值。 - -对于糖果的例子,我们可以计算在所有糖果的相同频率的零假设下,我们观察到的卡方值为 0.74 的可能性。我们使用自由度等于 k-1(其中 k=类别数)的卡方分布,因为我们在计算平均值以生成预期值时失去了一个自由度。 - -```r -pval <- pchisq(chisqVal, df = 2, lower.tail = FALSE) #df = degrees of freedom -sprintf("p-value = %0.3f", pval) -``` - -```r -## [1] "p-value = 0.691" -``` - -这表明,观察到的糖果数量并不是特别令人惊讶的,基于印刷在糖果袋上的比例,我们不会拒绝等比的无效假设。 - -## 12.3 应急表及双向试验 - -我们经常使用卡方检验的另一种方法是询问两个分类变量是否相互关联。作为一个更现实的例子,让我们来考虑一个问题,当一个黑人司机被警察拦下时,他们是否比一个白人司机更有可能被搜查,斯坦福公开警务项目([https://open policing.stanford.edu/](https://openpolicing.stanford.edu/))研究了这个问题,并提供了我们可以用来分析问题的数据。我们将使用来自康涅狄格州的数据,因为它们相当小。首先清理这些数据,以删除所有不必要的数据(参见 code/process_ct_data.py)。 - -```r -# load police stop data -stopData <- - read_csv("data/CT_data_cleaned.csv") %>% - rename(searched = search_conducted) -``` - -表示分类分析数据的标准方法是通过 _ 列联表 _,列联表显示了属于每个变量值的每个可能组合的观测值的数量或比例。 - -让我们计算一下警察搜索数据的应急表: - -```r -# compute and print two-way contingency table -summaryDf2way <- - stopData %>% - count(searched, driver_race) %>% - arrange(driver_race, searched) - -summaryContingencyTable <- - summaryDf2way %>% - spread(driver_race, n) - -pander(summaryContingencyTable) -``` - - -| 已搜索 | 黑色 | 白色 | -| --- | --- | --- | -| 错误的 | 36244 个 | 239241 个 | -| 真的 | 1219 年 | 3108 个 | - -使用比例而不是原始数字查看应急表也很有用,因为它们更容易在视觉上进行比较。 - -```r -# Compute and print contingency table using proportions -# rather than raw frequencies -summaryContingencyTableProportion <- - summaryContingencyTable %>% - mutate( - Black = Black / nrow(stopData), #count of Black individuals searched / total searched - White = White / nrow(stopData) - ) -pander(summaryContingencyTableProportion, round = 4) -``` - - -| searched | Black | White | -| --- | --- | --- | -| FALSE | 0.1295 年 | 0.855 个 | -| TRUE | 0.0044 美元 | 0.0111 个 | - -Pearson 卡方检验允许我们检验观察到的频率是否与预期频率不同,因此我们需要确定如果搜索和种族不相关,我们期望在每个细胞中出现的频率,我们可以定义为 _ 独立。_ 请记住,如果 x 和 y 是独立的,那么: - -![](img/ae00b41c7d126a5646eb9e06bf53e695.jpg) - -也就是说,零独立假设下的联合概率仅仅是每个变量的 _ 边际 _ 概率的乘积。边际概率只是每一个事件发生的概率,与其他事件无关。我们可以计算这些边际概率,然后将它们相乘,得到独立状态下的预期比例。 - -| | 黑色 | 白色 | | -| --- | --- | --- | --- | -| 未搜索 | P(ns)*P(b) | P(ns)*P(w) | P(纳秒) | -| 已搜索 | P(S)*P(B) | P(S)*P(W) | P(S) | -| | P(B) | P(宽) | | - -我们可以使用称为“外积”的线性代数技巧(通过`outer()`函数)来轻松计算。 - -```r -# first, compute the marginal probabilities - -# probability of being each race -summaryDfRace <- - stopData %>% - count(driver_race) %>% #count the number of drivers of each race - mutate( - prop = n / sum(n) #compute the proportion of each race out of all drivers - ) - -# probability of being searched -summaryDfStop <- - stopData %>% - count(searched) %>% #count the number of searched vs. not searched - mutate( - prop = n / sum(n) # compute proportion of each outcome out all traffic stops - ) -``` - -```r -# second, multiply outer product by n (all stops) to compute expected frequencies -expected <- outer(summaryDfRace$prop, summaryDfStop$prop) * nrow(stopData) - -# create a data frame of expected frequencies for each race -expectedDf <- - data.frame(expected, driverRace = c("Black", "White")) %>% - rename( - NotSearched = X1, - Searched = X2 - ) - -# tidy the data frame -expectedDfTidy <- - gather(expectedDf, searched, n, -driverRace) %>% - arrange(driverRace, searched) -``` - -```r -# third, add expected frequencies to the original summary table -# and fourth, compute the standardized squared difference between -# the observed and expected frequences - -summaryDf2way <- - summaryDf2way %>% - mutate(expected = expectedDfTidy$n) - -summaryDf2way <- - summaryDf2way %>% - mutate(stdSqDiff = (n - expected)**2 / expected) - -pander(summaryDf2way) -``` - - -| searched | 车手比赛 | N 号 | 预期 | 标准平方差 | -| --- | --- | --- | --- | --- | -| FALSE | 黑色 | 36244 | 36883.67 个 | 2009 年 11 月 | -| TRUE | Black | 1219 | 579.33 条 | 第 706.31 条 | -| FALSE | 白色 | 239241 | 238601.3 条 | 1.71 条 | -| TRUE | White | 3108 | 3747.67 美元 | 109.18 条 | - -```r -# finally, compute chi-squared statistic by -# summing the standardized squared differences -chisq <- sum(summaryDf2way$stdSqDiff) -sprintf("Chi-squared value = %0.2f", chisq) -``` - -```r -## [1] "Chi-squared value = 828.30" -``` - -在计算了卡方统计之后,我们现在需要将其与卡方分布进行比较,以确定它与我们在无效假设下的期望相比有多极端。这种分布的自由度是![](img/206275e6a74b69f71d35c279b3e2d1c0.jpg)——因此,对于类似于这里的 2x2 表,![](img/ba8975aad6841ab43375c0463cf596e7.jpg)。这里的直觉是计算预期频率需要我们使用三个值:观察总数和两个变量的边际概率。因此,一旦计算出这些值,就只有一个数字可以自由变化,因此有一个自由度。鉴于此,我们可以计算卡方统计的 p 值: - -```r -pval <- pchisq(chisq, df = 1, lower.tail = FALSE) -sprintf("p-value = %e", pval) -``` - -```r -## [1] "p-value = 3.795669e-182" -``` - -![](img/0a218a4dadec40dff9f8d2264a3c9d39.jpg)的 p 值非常小,表明如果种族和警察搜查之间真的没有关系,观察到的数据就不太可能,因此我们应该拒绝独立性的无效假设。 - -我们还可以使用 r 中的`chisq.test()`函数轻松执行此测试: - -```r -# first need to rearrange the data into a 2x2 table -summaryDf2wayTable <- - summaryDf2way %>% - dplyr::select(-expected, -stdSqDiff) %>% - spread(searched, n) %>% - dplyr::select(-driver_race) - -chisqTestResult <- chisq.test(summaryDf2wayTable, 1, correct = FALSE) -chisqTestResult -``` - -```r -## -## Pearson's Chi-squared test -## -## data: summaryDf2wayTable -## X-squared = 800, df = 1, p-value <2e-16 -``` - -## 12.4 标准化残差 - -当我们发现卡方检验的显著效果时,这告诉我们,在无效假设下,数据是不可能的,但它并没有告诉我们 _ 数据有什么不同。为了更深入地了解数据与我们在零假设下预期的差异,我们可以检查模型的残差,该残差反映了数据(即观察到的频率)与每个单元中模型的偏差(即预期频率)。而不是查看原始残差(仅根据数据中观察的数量而变化),更常见的是查看其他 _ 标准化残差 _,其计算如下:_ - -![](img/fc6dfc834654c8a6d8b2323c1bd6b480.jpg) - -其中![](img/31df9c730e19ca29b59dce64b99d98c1.jpg)和![](img/d8fdd0e28cfb03738fc5227885ee035a.jpg)分别是行和列的索引。我们可以为警察局的数据计算这些数据: - -```r -# compute standardized residuals -summaryDf2way <- - summaryDf2way %>% - mutate(stdRes = (n - expected)/sqrt(expected)) - -pander(summaryDf2way) -``` - - -| 已搜索 | 车手比赛 | N 号 | 预期 | 标准平方差 | 标准普尔 | -| --- | --- | --- | --- | --- | --- | -| 错误的 | 黑色 | 36244 个 | 36883.67 个 | 2009 年 11 月 | -3.33 条 | -| 真的 | Black | 1219 年 | 579.33 条 | 第 706.31 条 | 26.58 美元 | -| FALSE | 白色 | 239241 个 | 238601.3 条 | 1.71 条 | 1.31 条 | -| TRUE | White | 3108 个 | 3747.67 美元 | 109.18 条 | -10.45 美元 | - -这些标准化的残差可以解释为 z 分数——在这种情况下,我们看到,基于独立性,对黑人个体的搜索次数大大高于预期,而对白人个体的搜索次数大大低于预期。这为我们提供了解释显著的卡方结果所需的上下文。 - -## 12.5 优势比 - -我们还可以使用前面介绍的优势比在应急表中表示不同结果的相对可能性,以便更好地了解影响的大小。首先,我们表示每一场比赛被阻止的几率: - -![](img/e6acd79788a8dbe24193b20151db6a12.jpg) - -![](img/9aa2622d4176179ddfde24206732f146.jpg)![](img/be906c2bfa49b7ba6d831a99b9f47c71.jpg) - -根据这一数据集,优势比显示,黑人和白人驾驶员被搜索的几率要高出 2.59 倍。 - -## 12.6 贝叶斯系数 - -![](img/ed955fccd67d36cab5ec92cfcd8c1742.jpg) - -我们在关于贝叶斯统计的前一章中讨论了贝叶斯因子——你可能记得它代表了两种假设下数据的可能性比:贝叶斯因子在某种程度上类似于 p 值和影响大小,也就是说它们的解释是某种意义上的。t 主观。他们的解释有各种各样的指导方针——这是来自 Kass 和 Raftery(1995)的一个: - -| 高炉 | 解释 | -| --- | --- | -| 1 到 3 | 不值得一提 | -| 3 至 20 | 积极的 | -| 20 至 150 | 坚强的 | -| 150 及以上 | 非常强壮 | - -我们可以使用 BayesFactor 包中的`contingencyTableBF()`函数计算警察搜索数据的 Bayes 因子: - -```r -# compute Bayes factor -# using independent multinomial sampling plan in which row totals (driver race) -# are fixed - -bf <- - contingencyTableBF(as.matrix(summaryDf2wayTable), - sampleType = "indepMulti", - fixedMargin = "cols" -) -bf -``` - -```r -## Bayes factor analysis -## -------------- -## [1] Non-indep. (a=1) : 1.8e+142 ±0% -## -## Against denominator: -## Null, independence, a = 1 -## --- -## Bayes factor type: BFcontingencyTable, independent multinomial -``` - -这表明,在这个数据集中,支持驾驶员种族和警察搜索之间关系的证据非常有力。 - -## 12.7 超出 2 x 2 表的分类分析 - -分类分析也可以应用于应急表,其中每个变量有两个以上的类别。 - -例如,让我们看一下 nhanes 的数据,比较变量 _depressed_,它表示“参与者感到沮丧、沮丧或绝望的自我报告天数”。此变量编码为`None`、`Several`或`Most`。让我们测试这个变量是否与 _sleeptrouble_ 变量相关,这个变量报告个人是否向医生报告了睡眠问题。 - -```r -# summarize depression as a function of sleep trouble -depressedSleepTrouble <- - NHANES_adult %>% - drop_na(SleepTrouble, Depressed) %>% - count(SleepTrouble, Depressed) %>% - arrange(SleepTrouble, Depressed) - -depressedSleepTroubleTable <- - depressedSleepTrouble %>% - spread(SleepTrouble, n) %>% - rename( - NoSleepTrouble = No, - YesSleepTrouble = Yes - ) - -pander(depressedSleepTroubleTable) -``` - - -| 沮丧的 | 无阻力 | 是的,可重复 | -| --- | --- | --- | -| 无 | 2614 个 | 676 个 | -| 几个 | 418 个 | 249 个 | -| 大多数 | 138 个 | 145 个 | - -简单地看一下这些数据,我们就可以知道这两个变量之间可能存在某种关系;特别是,尽管睡眠问题患者的总数比没有睡眠问题的患者要少很多,但对于大多数时间都处于抑郁状态的患者来说,睡眠问题患者的数量更大。比没有的要水。我们可以直接使用卡方检验对其进行量化;如果我们的数据框只包含两个变量,那么我们可以简单地将数据框作为参数提供给`chisq.test()`函数: - -```r -# need to remove the column with the label names -depressedSleepTroubleTable <- - depressedSleepTroubleTable %>% - dplyr::select(-Depressed) - -depressedSleepChisq <- chisq.test(depressedSleepTroubleTable) -depressedSleepChisq -``` - -```r -## -## Pearson's Chi-squared test -## -## data: depressedSleepTroubleTable -## X-squared = 200, df = 2, p-value <2e-16 -``` - -这项测试表明,抑郁和睡眠问题之间有很强的关系。我们还可以计算贝叶斯因子来量化有利于替代假设的证据的强度: - -```r -# compute bayes factor, using a joint multinomial sampling plan -bf <- - contingencyTableBF( - as.matrix(depressedSleepTroubleTable), - sampleType = "jointMulti" - ) -bf -``` - -```r -## Bayes factor analysis -## -------------- -## [1] Non-indep. (a=1) : 1.8e+35 ±0% -## -## Against denominator: -## Null, independence, a = 1 -## --- -## Bayes factor type: BFcontingencyTable, joint multinomial -``` - -在这里,我们看到贝叶斯系数非常大,这表明支持抑郁和睡眠问题之间关系的证据非常有力。 - -## 12.8 注意辛普森悖论 - -上述应急表是对大量观察结果的总结,但有时会产生误导。让我们以棒球为例。下表显示了 1995-1997 年间德里克·杰特和大卫·贾斯汀的击球数据(击数/击数和平均击球数): - -| 玩家 | 1995 年 | | 1996 年 | | 1997 年 | | 合并 | | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| 基特 | 12 月 48 日 | 0.250 | 183/582 年 | .314 条 | 190/654 年 | .291 条 | 385/1284 年 | **.300** | -| 大卫·正义 | 104/411 号 | **.253** | 45/140 分 | **.321** | 163/495 年 | **.329** | 312/1046 年 | .298 条 | - -如果你仔细观察,你会发现有些奇怪的事情正在发生:在每一年,正义比杰特有一个更高的击球平均值,但当我们结合所有三年的数据,杰特的平均值实际上高于正义!这是一个被称为 _ 辛普森悖论 _ 的现象的例子,在这种现象中,组合数据集中的模式可能不存在于数据的任何子集中。当有另一个变量可能在不同的子集之间发生变化时,就会发生这种情况——在这种情况下,AT 蝙蝠的数量随着时间的推移而变化,1995 年司法部的击球次数更多(击球平均数较低时)。我们把它称为一个潜伏变量(htg2),每当我们检查分类数据时,注意这些变量总是很重要的。 \ No newline at end of file diff --git a/docs/13.md b/docs/13.md index 62b4b457467a38aa90f612ad296de4d3f7d384b5..9ed0bf3f7bd6d47f95483509012710faa3dd4745 100644 --- a/docs/13.md +++ b/docs/13.md @@ -1,3 +1,321 @@ # 13 建模持续关系 -大多数人都熟悉 _ 相关 _ 的概念,在本章中,我们将对这个常用和误解的概念提供更正式的理解。 \ No newline at end of file +大多数人都熟悉 _ 相关 _ 的概念,在本章中,我们将对这个常用和误解的概念提供更正式的理解。 + +## 13.1 一个例子:仇恨犯罪和收入不平等 + +2017 年,网站 fivethirtyeight.com 发表了一篇题为“仇恨犯罪率上升与收入不平等(htg1)”的文章,讨论了 2016 年总统选举后仇恨犯罪率与收入不平等之间的关系。报道分析了来自联邦调查局和南方贫困法中心的仇恨犯罪数据,并据此报告: + +> “我们发现,收入不平等是全美国调整人口仇恨犯罪和仇恨事件的最重要决定因素”。 + +此分析的数据包含在`fivethirtyeight`r 包中,这使得我们很容易访问它们。报道中的分析集中在收入不平等(定义为一个叫做 _ 基尼指数 _ 的量)与各州仇恨犯罪流行率之间的关系。 + +# + +## 13.1.1 量化不平等:基尼指数 + +在我们查看报道中的分析之前,首先要了解如何使用基尼指数来量化不平等。基尼指数通常用一条曲线来定义,这条曲线描述了收入与收入水平等于或小于该水平的人口比例之间的关系,称为 _ 洛伦兹曲线 _。然而,另一种更直观的思考方式是:收入之间的相对平均绝对差异除以二(摘自[https://en.wikipedia.org/wiki/gini_coefficient](https://en.wikipedia.org/wiki/Gini_coefficient)): + +![](img/1283ad31298b6a845d0b54ea5116c77d.jpg) + +![Lorenz curves for A) perfect equality, B) normally distributed income, and C) high inequality (equal income except for one very wealthy individual).](img/file76.png) + +图 13.1 洛伦兹曲线表示 a)完全平等,b)正态分布收入,c)高度不平等(除一个非常富有的个人外,收入相等)。 + +图[13.1](#fig:gini0)显示了几种不同收入分配的洛伦兹曲线。左上方的面板(A)显示了一个例子,其中有 10 个人,每个人的收入完全相同。两个点之间的间隔长度相等,表明每个人在总收入中所占的份额相同。右上角的面板(B)显示了一个收入正态分布的例子。左下角的面板显示了一个不平等程度很高的例子:每个人的收入都是平等的(40000 美元),只有一个人的收入是 40000000 美元。根据美国人口普查,2010 年美国的基尼指数为 0.469,大约在我们的正态分布和最大不相等的例子之间下降了一半。 + +## 13.2 收入不平等是否与仇恨犯罪有关? + +现在我们了解了基尼指数,我们可以看看收入不平等与仇恨犯罪率之间的关系(见图[13.2](#fig:hateCrimeGini))。 + +```r +hateCrimes <- + hate_crimes %>% + mutate(state_abb = state.abb[match(state,state.name)]) %>% + drop_na(avg_hatecrimes_per_100k_fbi) + +hateCrimes$state_abb[hateCrimes$state=="District of Columbia"]='DC' + +ggplot(hateCrimes,aes(gini_index,avg_hatecrimes_per_100k_fbi,label=state_abb)) + + geom_point() + + geom_text(aes(label=state_abb),hjust=0, vjust=0) + + theme(plot.title = element_text(size = 20, face = "bold")) + + xlab('Gini index') + + ylab('Avg hate crimes per 100K population (FBI)') + + theme(plot.margin = unit(c(1,1,1,1), "cm")) +``` + +![Plot of rates of hate crimes vs. Gini index.](img/file77.png) + +图 13.2 仇恨犯罪率与基尼指数的关系图。 + +从数据来看,这两个变量之间似乎有一个正的关系。我们如何量化这种关系? + +## 13.3 协方差和相关性 + +量化两个变量之间关系的一种方法是 _ 协方差 _。记住,单个变量的方差计算如下: + +![](img/134e6de0f245b57b2f07e6a35831cb9e.jpg) + +这告诉我们每个观察值与平均值相差多远。协方差告诉我们两个不同的变量在观测值之间的偏差是否存在关系。定义如下: + +![](img/b268259e45c69b4bfdac3da4ed6962b5.jpg) + +当 x 和 y 都高度偏离平均值时,该值将远离零;如果它们在同一方向上偏离,则协方差为正,而如果它们在相反方向上偏离,则协方差为负。让我们先看一个玩具的例子。 + +```r +# create data for toy example of covariance +df <- + tibble(x = c(3, 5, 8, 10, 12)) %>% + mutate(y = x + round(rnorm(n = 5, mean = 0, sd = 2))) %>% + mutate( + y_dev = y - mean(y), + x_dev = x - mean(x) + ) %>% + mutate(crossproduct = y_dev * x_dev) + +pander(df) +``` + + +| X | 是 | Y 轴偏差 | X 轴偏差 | 叉乘 | +| --- | --- | --- | --- | --- | +| 三 | 1 个 | -6.6 条 | -4.6 节 | 30.36 天 | +| 5 个 | 3 | -4.6 | -第 2.6 条 | 11.96 年 | +| 8 个 | 8 | 0.4 倍 | 0.4 | 0.16 分 | +| 10 个 | 12 个 | 第 4.4 条 | 第 2.4 条 | 10.56 条 | +| 12 | 14 | 第 6.4 条 | 4.4 | 28.16 条 | + +```r +# compute covariance + +sprintf("sum of cross products = %.2f", sum(df$crossproduct)) +``` + +```r +## [1] "sum of cross products = 81.20" +``` + +```r +covXY <- sum(df$crossproduct) / (nrow(df) - 1) +sprintf("covariance: %.2f", covXY) +``` + +```r +## [1] "covariance: 20.30" +``` + +我们通常不使用协方差来描述变量之间的关系,因为它随数据的总体方差水平而变化。相反,我们通常使用 _ 相关系数 _(通常在统计学家 Karl Pearson 之后称为 _Pearson 相关 _)。通过用两个变量的标准偏差缩放协方差来计算相关性: + +![](img/69240baf835a9a8f0311c744556cb85f.jpg) + +```r +# compute the correlation coefficient + +corXY <- sum(df$crossproduct) / ((nrow(df) - 1) * sd(df$x) * sd(df$y)) +sprintf("correlation coefficient = %.2f", corXY) +``` + +```r +## [1] "correlation coefficient = 0.99" +``` + +我们还可以使用 r 中的`cor()`函数轻松计算相关值: + +```r +# compute r using built-in function + +c <- cor(df$x, df$y) +sprintf("correlation coefficient = %.2f", c) +``` + +```r +## [1] "correlation coefficient = 0.99" +``` + +相关系数是有用的,因为它在-1 和 1 之间变化,不管数据的性质如何-事实上,我们在讨论影响大小时已经讨论过相关系数。正如我们在上一章关于影响大小的内容中看到的,1 的相关性表示一个完美的线性关系,-1 的相关性表示一个完美的负关系,0 的相关性表示没有线性关系。 + +我们可以计算仇恨犯罪数据的相关系数: + +```r +corGiniHC <- + cor( + hateCrimes$gini_index, + hateCrimes$avg_hatecrimes_per_100k_fbi + ) +sprintf('correlation coefficient = %.2f',corGiniHC) +``` + +```r +## [1] "correlation coefficient = 0.42" +``` + +# + +## 13.3.1 相关性假设检验 + +相关值 0.42 似乎表明两个变量之间的关系相当强,但我们也可以想象,即使没有关系,这种情况也可能是偶然发生的。我们可以使用一个简单的公式来测试相关性为零的空假设,该公式允许我们将相关性值转换为 _t_ 统计: + +![](img/8a7e337cf588bdff49bc2f192c7eac97.jpg) + +在零假设![](img/fed676a693d5c98216a52108307827c6.jpg)下,该统计量以自由度为 t 分布。我们可以使用 r 中的`cor.test()`函数计算: + +```r +# perform correlation test on hate crime data +cor.test( + hateCrimes$avg_hatecrimes_per_100k_fbi, + hateCrimes$gini_index +) +``` + +```r +## +## Pearson's product-moment correlation +## +## data: hateCrimes$avg_hatecrimes_per_100k_fbi and hateCrimes$gini_index +## t = 3, df = 50, p-value = 0.002 +## alternative hypothesis: true correlation is not equal to 0 +## 95 percent confidence interval: +## 0.16 0.63 +## sample estimates: +## cor + + +## 0.42 +``` + +这个测试表明,R 值的可能性很低,这个极限或更高,所以我们将拒绝![](img/6937cddf1a8c4f47df75a6977e1234d1.jpg)的无效假设。注意,这个测试假设两个变量都是正态分布的。 + +我们也可以通过随机化来检验这一点,在随机化中,我们重复地改变其中一个变量的值并计算相关性,然后将我们观察到的相关性值与这个零分布进行比较,以确定我们观察到的值在零假设下的可能性。结果如图[13.3](#fig:shuffleCorr)所示。使用随机化计算的 p 值与 t 检验给出的答案相当相似。 + +```r +# compute null distribution by shuffling order of variable values + +# create a function to compute the correlation on the shuffled values +shuffleCorr <- function(x, y) { + xShuffled <- sample(x) + return(cor(xShuffled, y)) +} + +# run this function 2500 times +shuffleDist <- + replicate( + 2500, + shuffleCorr(hateCrimes$avg_hatecrimes_per_100k_fbi, hateCrimes$gini_index) + ) +``` + +![Histogram of correlation values under the null hypothesis, obtained by shuffling values. Observed value is denoted by blue line.](img/file78.png) + +图 13.3 零假设下相关值的柱状图,通过改变值获得。观测值用蓝线表示。 + +# + +## 13.3.2 稳健相关性 + +在图[13.2](#fig:hateCrimeGini)中,您可能注意到了一些有点奇怪的地方——其中一个数据点(哥伦比亚特区的数据点)似乎与其他数据点非常不同。我们称之为 _ 离群值 _,标准相关系数对离群值非常敏感。例如,在图[13.4](#fig:outlierCorr)中,我们可以看到一个孤立的数据点是如何导致非常高的正相关值的,即使其他数据点之间的实际关系是完全负的。 + +![An simulated example of the effects of outliers on correlation. Without the outlier the remainder of the datapoints have a perfect negative correlation, but the single outlier changes the correlation value to highly positive.](img/file79.png) + +图 13.4 异常值对相关性影响的模拟示例。如果没有离群值,其余数据点具有完全的负相关,但单个离群值将相关值更改为高度正相关。 + +解决离群值问题的一种方法是在排序后,在数据的列组上计算相关性,而不是在数据本身上计算相关性;这被称为 _ 斯皮尔曼相关性 _。图[13.4](#fig:outlierCorr)中的 Pearson 相关性为 0.83,而 Spearman 相关性为-0.45,表明等级相关性降低了异常值的影响。 + +我们可以使用`cor.test`函数计算仇恨犯罪数据的等级相关性: + +```r +corTestSpearman <- cor.test( hateCrimes$avg_hatecrimes_per_100k_fbi, + hateCrimes$gini_index, + method = "spearman") +corTestSpearman +``` + +```r +## +## Spearman's rank correlation rho +## +## data: hateCrimes$avg_hatecrimes_per_100k_fbi and hateCrimes$gini_index +## S = 20000, p-value = 0.8 +## alternative hypothesis: true rho is not equal to 0 +## sample estimates: +## rho + + +## 0.033 +``` + +现在我们看到相关性不再显著(实际上接近于零),这表明 Fivethirtyeight 博客帖子的声明可能由于离群值的影响而不正确。 + +# + +## 13.3.3 贝叶斯相关分析 + +我们也可以使用贝叶斯分析来分析五个第八个数据,这有两个优点。首先,它为我们提供了一个后验概率——在本例中,相关值超过零的概率。其次,贝叶斯估计将观察到的证据与 _ 先验 _ 相结合,从而使相关估计 _ 正则化,有效地将其拉向零。在这里,我们可以使用 bayesmed 包中的`jzs_cor`函数来计算它。_ + +```r +bayesCor <- jzs_cor( + hateCrimes$avg_hatecrimes_per_100k_fbi, + hateCrimes$gini_index +) +``` + +```r +## Compiling model graph +## Resolving undeclared variables +## Allocating nodes +## Graph information: +## Observed stochastic nodes: 50 +## Unobserved stochastic nodes: 4 +## Total graph size: 230 +## +## Initializing model +``` + +```r +bayesCor +``` + +```r +## $Correlation +## [1] 0.41 +## +## $BayesFactor +## [1] 11 +## +## $PosteriorProbability +## [1] 0.92 +``` + +请注意,使用贝叶斯方法估计的相关性略小于使用标准相关系数估计的相关性,这是由于该估计基于证据和先验的组合,从而有效地将估计缩小到反渗透。但是,请注意,贝叶斯分析对异常值不具有鲁棒性,它仍然表示有相当强的证据表明相关性大于零。 + +## 13.4 相关性和因果关系 + +当我们说一件事导致另一件事时,我们的意思是什么?关于因果关系意义的讨论在哲学上有着悠久的历史,但在统计学上,我们通常认为因果关系的一种方式是实验控制。也就是说,如果我们认为因子 x 导致因子 y,那么操纵 x 的值也应该操纵 y 的值。 + +在医学上,有一套被称为[_koch 的假设 _](https://en.wikipedia.org/wiki/Koch%27s_postulates)的观点,在历史上一直被用来确定一个特定的有机体是否引起疾病。基本思想是,有机体应该存在于有疾病的人身上,而不存在于没有疾病的人身上——因此,消除有机体的治疗也应该消除疾病。此外,感染有机体的人应使他们感染该疾病。巴里·马歇尔博士的工作就是一个例子,他假设胃溃疡是由一种细菌(_ 幽门螺杆菌 _)引起的。为了证明这一点,他感染了这种细菌,很快他的胃就出现了严重的炎症。然后他用抗生素治疗自己,他的胃很快就恢复了。他后来因这项工作获得了诺贝尔医学奖。 + +通常我们想测试因果假设,但实际上我们不能做实验,因为这是不可能的(“人类碳排放与地球气候之间的关系是什么?”)或不道德(“严重虐待对儿童大脑发育有什么影响?”)但是,我们仍然可以收集与这些问题相关的数据。例如,在后一个例子中,我们可以潜在地从遭受虐待的儿童和未遭受虐待的儿童那里收集数据,然后我们可以询问他们的大脑发育是否不同。 + +假设我们做了这样的分析,我们发现被虐待儿童的大脑发育比未被虐待儿童差。这是否表明虐待会导致大脑发育不良?不,当我们观察到两个变量之间的统计关联时,这两个变量中的一个肯定会引起另一个。然而,这两个变量都有可能受到第三个变量的影响;在这个例子中,虐待儿童可能与家庭压力有关,家庭压力也可能通过较少的智力投入、食物压力或许多其他可能导致大脑发育不良。大道。重点是,两个变量之间的相关性通常告诉我们有什么东西导致了其他事情,但它并不能告诉我们是什么导致了什么。正如统计学家 EdwardTufte 所说,“相关性并不意味着因果关系,但它是一个很好的提示。” + +# + +## 13.4.1 因果图 + +描述变量之间因果关系的一种有用方法是通过 _ 因果图 _,它将变量显示为圆,并将变量之间的因果关系显示为箭头。例如,图[13.5](#fig:simpleCausalGraph)显示了学习时间和我们认为应该受到影响的两个变量之间的因果关系:考试成绩和考试完成时间。 + +图 13.5 显示三个变量之间因果关系的图表:学习时间、考试成绩和考试结束时间。绿色箭头表示一种积极的关系(即学习时间越长,考试成绩越高),红色箭头表示一种消极的关系(即学习时间越长,考试完成越快)。 + +然而,事实上,对完成时间和成绩的影响并不是直接由花费在学习上的时间量造成的,而是由学生通过学习获得的知识量造成的。我们通常会说知识是一个潜在的(htg0)变量——也就是说,我们不能直接测量它,但是我们可以看到它反映在我们可以测量的变量中(比如成绩和完成时间)。图[13.6](#fig:latentCausalGraph)显示了这一点。 + +图 13.6 显示了与上述相同的因果关系的图,但现在也显示了使用平方框的潜在变量(知识)。 + +在这里,我们可以说知识(htg0)介导了学习时间和成绩/完成时间之间的关系。这意味着,如果我们能够保持知识的恒定性(例如,通过服用一种能立即引起遗忘的药物),那么学习时间的长短将不再对成绩和完成时间产生影响。 + +请注意,如果我们简单地测量考试成绩和完成时间,我们通常会看到他们之间的负面关系,因为完成考试最快的人通常得到最高的分数。然而,如果我们将这种相关性解释为因果关系,这将告诉我们,为了获得更好的成绩,我们实际上应该更快地完成考试!这个例子说明了从非实验数据推断因果关系是多么困难。 + +在统计学和机器学习领域,有一个非常活跃的研究团体,目前正在研究从非实验数据推断因果关系的时间和方式问题。然而,这些方法往往需要强有力的假设,通常必须谨慎使用。 + +## 13.5 阅读建议 + +* [朱迪亚·珀尔的《为什么》(htg1)一书-对因果推理背后的思想的极好介绍。](http://bayes.cs.ucla.edu/WHY/) \ No newline at end of file diff --git a/docs/13.x2.md b/docs/13.x2.md deleted file mode 100644 index 9ed0bf3f7bd6d47f95483509012710faa3dd4745..0000000000000000000000000000000000000000 --- a/docs/13.x2.md +++ /dev/null @@ -1,321 +0,0 @@ -# 13 建模持续关系 - -大多数人都熟悉 _ 相关 _ 的概念,在本章中,我们将对这个常用和误解的概念提供更正式的理解。 - -## 13.1 一个例子:仇恨犯罪和收入不平等 - -2017 年,网站 fivethirtyeight.com 发表了一篇题为“仇恨犯罪率上升与收入不平等(htg1)”的文章,讨论了 2016 年总统选举后仇恨犯罪率与收入不平等之间的关系。报道分析了来自联邦调查局和南方贫困法中心的仇恨犯罪数据,并据此报告: - -> “我们发现,收入不平等是全美国调整人口仇恨犯罪和仇恨事件的最重要决定因素”。 - -此分析的数据包含在`fivethirtyeight`r 包中,这使得我们很容易访问它们。报道中的分析集中在收入不平等(定义为一个叫做 _ 基尼指数 _ 的量)与各州仇恨犯罪流行率之间的关系。 - -# - -## 13.1.1 量化不平等:基尼指数 - -在我们查看报道中的分析之前,首先要了解如何使用基尼指数来量化不平等。基尼指数通常用一条曲线来定义,这条曲线描述了收入与收入水平等于或小于该水平的人口比例之间的关系,称为 _ 洛伦兹曲线 _。然而,另一种更直观的思考方式是:收入之间的相对平均绝对差异除以二(摘自[https://en.wikipedia.org/wiki/gini_coefficient](https://en.wikipedia.org/wiki/Gini_coefficient)): - -![](img/1283ad31298b6a845d0b54ea5116c77d.jpg) - -![Lorenz curves for A) perfect equality, B) normally distributed income, and C) high inequality (equal income except for one very wealthy individual).](img/file76.png) - -图 13.1 洛伦兹曲线表示 a)完全平等,b)正态分布收入,c)高度不平等(除一个非常富有的个人外,收入相等)。 - -图[13.1](#fig:gini0)显示了几种不同收入分配的洛伦兹曲线。左上方的面板(A)显示了一个例子,其中有 10 个人,每个人的收入完全相同。两个点之间的间隔长度相等,表明每个人在总收入中所占的份额相同。右上角的面板(B)显示了一个收入正态分布的例子。左下角的面板显示了一个不平等程度很高的例子:每个人的收入都是平等的(40000 美元),只有一个人的收入是 40000000 美元。根据美国人口普查,2010 年美国的基尼指数为 0.469,大约在我们的正态分布和最大不相等的例子之间下降了一半。 - -## 13.2 收入不平等是否与仇恨犯罪有关? - -现在我们了解了基尼指数,我们可以看看收入不平等与仇恨犯罪率之间的关系(见图[13.2](#fig:hateCrimeGini))。 - -```r -hateCrimes <- - hate_crimes %>% - mutate(state_abb = state.abb[match(state,state.name)]) %>% - drop_na(avg_hatecrimes_per_100k_fbi) - -hateCrimes$state_abb[hateCrimes$state=="District of Columbia"]='DC' - -ggplot(hateCrimes,aes(gini_index,avg_hatecrimes_per_100k_fbi,label=state_abb)) + - geom_point() + - geom_text(aes(label=state_abb),hjust=0, vjust=0) + - theme(plot.title = element_text(size = 20, face = "bold")) + - xlab('Gini index') + - ylab('Avg hate crimes per 100K population (FBI)') + - theme(plot.margin = unit(c(1,1,1,1), "cm")) -``` - -![Plot of rates of hate crimes vs. Gini index.](img/file77.png) - -图 13.2 仇恨犯罪率与基尼指数的关系图。 - -从数据来看,这两个变量之间似乎有一个正的关系。我们如何量化这种关系? - -## 13.3 协方差和相关性 - -量化两个变量之间关系的一种方法是 _ 协方差 _。记住,单个变量的方差计算如下: - -![](img/134e6de0f245b57b2f07e6a35831cb9e.jpg) - -这告诉我们每个观察值与平均值相差多远。协方差告诉我们两个不同的变量在观测值之间的偏差是否存在关系。定义如下: - -![](img/b268259e45c69b4bfdac3da4ed6962b5.jpg) - -当 x 和 y 都高度偏离平均值时,该值将远离零;如果它们在同一方向上偏离,则协方差为正,而如果它们在相反方向上偏离,则协方差为负。让我们先看一个玩具的例子。 - -```r -# create data for toy example of covariance -df <- - tibble(x = c(3, 5, 8, 10, 12)) %>% - mutate(y = x + round(rnorm(n = 5, mean = 0, sd = 2))) %>% - mutate( - y_dev = y - mean(y), - x_dev = x - mean(x) - ) %>% - mutate(crossproduct = y_dev * x_dev) - -pander(df) -``` - - -| X | 是 | Y 轴偏差 | X 轴偏差 | 叉乘 | -| --- | --- | --- | --- | --- | -| 三 | 1 个 | -6.6 条 | -4.6 节 | 30.36 天 | -| 5 个 | 3 | -4.6 | -第 2.6 条 | 11.96 年 | -| 8 个 | 8 | 0.4 倍 | 0.4 | 0.16 分 | -| 10 个 | 12 个 | 第 4.4 条 | 第 2.4 条 | 10.56 条 | -| 12 | 14 | 第 6.4 条 | 4.4 | 28.16 条 | - -```r -# compute covariance - -sprintf("sum of cross products = %.2f", sum(df$crossproduct)) -``` - -```r -## [1] "sum of cross products = 81.20" -``` - -```r -covXY <- sum(df$crossproduct) / (nrow(df) - 1) -sprintf("covariance: %.2f", covXY) -``` - -```r -## [1] "covariance: 20.30" -``` - -我们通常不使用协方差来描述变量之间的关系,因为它随数据的总体方差水平而变化。相反,我们通常使用 _ 相关系数 _(通常在统计学家 Karl Pearson 之后称为 _Pearson 相关 _)。通过用两个变量的标准偏差缩放协方差来计算相关性: - -![](img/69240baf835a9a8f0311c744556cb85f.jpg) - -```r -# compute the correlation coefficient - -corXY <- sum(df$crossproduct) / ((nrow(df) - 1) * sd(df$x) * sd(df$y)) -sprintf("correlation coefficient = %.2f", corXY) -``` - -```r -## [1] "correlation coefficient = 0.99" -``` - -我们还可以使用 r 中的`cor()`函数轻松计算相关值: - -```r -# compute r using built-in function - -c <- cor(df$x, df$y) -sprintf("correlation coefficient = %.2f", c) -``` - -```r -## [1] "correlation coefficient = 0.99" -``` - -相关系数是有用的,因为它在-1 和 1 之间变化,不管数据的性质如何-事实上,我们在讨论影响大小时已经讨论过相关系数。正如我们在上一章关于影响大小的内容中看到的,1 的相关性表示一个完美的线性关系,-1 的相关性表示一个完美的负关系,0 的相关性表示没有线性关系。 - -我们可以计算仇恨犯罪数据的相关系数: - -```r -corGiniHC <- - cor( - hateCrimes$gini_index, - hateCrimes$avg_hatecrimes_per_100k_fbi - ) -sprintf('correlation coefficient = %.2f',corGiniHC) -``` - -```r -## [1] "correlation coefficient = 0.42" -``` - -# - -## 13.3.1 相关性假设检验 - -相关值 0.42 似乎表明两个变量之间的关系相当强,但我们也可以想象,即使没有关系,这种情况也可能是偶然发生的。我们可以使用一个简单的公式来测试相关性为零的空假设,该公式允许我们将相关性值转换为 _t_ 统计: - -![](img/8a7e337cf588bdff49bc2f192c7eac97.jpg) - -在零假设![](img/fed676a693d5c98216a52108307827c6.jpg)下,该统计量以自由度为 t 分布。我们可以使用 r 中的`cor.test()`函数计算: - -```r -# perform correlation test on hate crime data -cor.test( - hateCrimes$avg_hatecrimes_per_100k_fbi, - hateCrimes$gini_index -) -``` - -```r -## -## Pearson's product-moment correlation -## -## data: hateCrimes$avg_hatecrimes_per_100k_fbi and hateCrimes$gini_index -## t = 3, df = 50, p-value = 0.002 -## alternative hypothesis: true correlation is not equal to 0 -## 95 percent confidence interval: -## 0.16 0.63 -## sample estimates: -## cor - - -## 0.42 -``` - -这个测试表明,R 值的可能性很低,这个极限或更高,所以我们将拒绝![](img/6937cddf1a8c4f47df75a6977e1234d1.jpg)的无效假设。注意,这个测试假设两个变量都是正态分布的。 - -我们也可以通过随机化来检验这一点,在随机化中,我们重复地改变其中一个变量的值并计算相关性,然后将我们观察到的相关性值与这个零分布进行比较,以确定我们观察到的值在零假设下的可能性。结果如图[13.3](#fig:shuffleCorr)所示。使用随机化计算的 p 值与 t 检验给出的答案相当相似。 - -```r -# compute null distribution by shuffling order of variable values - -# create a function to compute the correlation on the shuffled values -shuffleCorr <- function(x, y) { - xShuffled <- sample(x) - return(cor(xShuffled, y)) -} - -# run this function 2500 times -shuffleDist <- - replicate( - 2500, - shuffleCorr(hateCrimes$avg_hatecrimes_per_100k_fbi, hateCrimes$gini_index) - ) -``` - -![Histogram of correlation values under the null hypothesis, obtained by shuffling values. Observed value is denoted by blue line.](img/file78.png) - -图 13.3 零假设下相关值的柱状图,通过改变值获得。观测值用蓝线表示。 - -# - -## 13.3.2 稳健相关性 - -在图[13.2](#fig:hateCrimeGini)中,您可能注意到了一些有点奇怪的地方——其中一个数据点(哥伦比亚特区的数据点)似乎与其他数据点非常不同。我们称之为 _ 离群值 _,标准相关系数对离群值非常敏感。例如,在图[13.4](#fig:outlierCorr)中,我们可以看到一个孤立的数据点是如何导致非常高的正相关值的,即使其他数据点之间的实际关系是完全负的。 - -![An simulated example of the effects of outliers on correlation. Without the outlier the remainder of the datapoints have a perfect negative correlation, but the single outlier changes the correlation value to highly positive.](img/file79.png) - -图 13.4 异常值对相关性影响的模拟示例。如果没有离群值,其余数据点具有完全的负相关,但单个离群值将相关值更改为高度正相关。 - -解决离群值问题的一种方法是在排序后,在数据的列组上计算相关性,而不是在数据本身上计算相关性;这被称为 _ 斯皮尔曼相关性 _。图[13.4](#fig:outlierCorr)中的 Pearson 相关性为 0.83,而 Spearman 相关性为-0.45,表明等级相关性降低了异常值的影响。 - -我们可以使用`cor.test`函数计算仇恨犯罪数据的等级相关性: - -```r -corTestSpearman <- cor.test( hateCrimes$avg_hatecrimes_per_100k_fbi, - hateCrimes$gini_index, - method = "spearman") -corTestSpearman -``` - -```r -## -## Spearman's rank correlation rho -## -## data: hateCrimes$avg_hatecrimes_per_100k_fbi and hateCrimes$gini_index -## S = 20000, p-value = 0.8 -## alternative hypothesis: true rho is not equal to 0 -## sample estimates: -## rho - - -## 0.033 -``` - -现在我们看到相关性不再显著(实际上接近于零),这表明 Fivethirtyeight 博客帖子的声明可能由于离群值的影响而不正确。 - -# - -## 13.3.3 贝叶斯相关分析 - -我们也可以使用贝叶斯分析来分析五个第八个数据,这有两个优点。首先,它为我们提供了一个后验概率——在本例中,相关值超过零的概率。其次,贝叶斯估计将观察到的证据与 _ 先验 _ 相结合,从而使相关估计 _ 正则化,有效地将其拉向零。在这里,我们可以使用 bayesmed 包中的`jzs_cor`函数来计算它。_ - -```r -bayesCor <- jzs_cor( - hateCrimes$avg_hatecrimes_per_100k_fbi, - hateCrimes$gini_index -) -``` - -```r -## Compiling model graph -## Resolving undeclared variables -## Allocating nodes -## Graph information: -## Observed stochastic nodes: 50 -## Unobserved stochastic nodes: 4 -## Total graph size: 230 -## -## Initializing model -``` - -```r -bayesCor -``` - -```r -## $Correlation -## [1] 0.41 -## -## $BayesFactor -## [1] 11 -## -## $PosteriorProbability -## [1] 0.92 -``` - -请注意,使用贝叶斯方法估计的相关性略小于使用标准相关系数估计的相关性,这是由于该估计基于证据和先验的组合,从而有效地将估计缩小到反渗透。但是,请注意,贝叶斯分析对异常值不具有鲁棒性,它仍然表示有相当强的证据表明相关性大于零。 - -## 13.4 相关性和因果关系 - -当我们说一件事导致另一件事时,我们的意思是什么?关于因果关系意义的讨论在哲学上有着悠久的历史,但在统计学上,我们通常认为因果关系的一种方式是实验控制。也就是说,如果我们认为因子 x 导致因子 y,那么操纵 x 的值也应该操纵 y 的值。 - -在医学上,有一套被称为[_koch 的假设 _](https://en.wikipedia.org/wiki/Koch%27s_postulates)的观点,在历史上一直被用来确定一个特定的有机体是否引起疾病。基本思想是,有机体应该存在于有疾病的人身上,而不存在于没有疾病的人身上——因此,消除有机体的治疗也应该消除疾病。此外,感染有机体的人应使他们感染该疾病。巴里·马歇尔博士的工作就是一个例子,他假设胃溃疡是由一种细菌(_ 幽门螺杆菌 _)引起的。为了证明这一点,他感染了这种细菌,很快他的胃就出现了严重的炎症。然后他用抗生素治疗自己,他的胃很快就恢复了。他后来因这项工作获得了诺贝尔医学奖。 - -通常我们想测试因果假设,但实际上我们不能做实验,因为这是不可能的(“人类碳排放与地球气候之间的关系是什么?”)或不道德(“严重虐待对儿童大脑发育有什么影响?”)但是,我们仍然可以收集与这些问题相关的数据。例如,在后一个例子中,我们可以潜在地从遭受虐待的儿童和未遭受虐待的儿童那里收集数据,然后我们可以询问他们的大脑发育是否不同。 - -假设我们做了这样的分析,我们发现被虐待儿童的大脑发育比未被虐待儿童差。这是否表明虐待会导致大脑发育不良?不,当我们观察到两个变量之间的统计关联时,这两个变量中的一个肯定会引起另一个。然而,这两个变量都有可能受到第三个变量的影响;在这个例子中,虐待儿童可能与家庭压力有关,家庭压力也可能通过较少的智力投入、食物压力或许多其他可能导致大脑发育不良。大道。重点是,两个变量之间的相关性通常告诉我们有什么东西导致了其他事情,但它并不能告诉我们是什么导致了什么。正如统计学家 EdwardTufte 所说,“相关性并不意味着因果关系,但它是一个很好的提示。” - -# - -## 13.4.1 因果图 - -描述变量之间因果关系的一种有用方法是通过 _ 因果图 _,它将变量显示为圆,并将变量之间的因果关系显示为箭头。例如,图[13.5](#fig:simpleCausalGraph)显示了学习时间和我们认为应该受到影响的两个变量之间的因果关系:考试成绩和考试完成时间。 - -图 13.5 显示三个变量之间因果关系的图表:学习时间、考试成绩和考试结束时间。绿色箭头表示一种积极的关系(即学习时间越长,考试成绩越高),红色箭头表示一种消极的关系(即学习时间越长,考试完成越快)。 - -然而,事实上,对完成时间和成绩的影响并不是直接由花费在学习上的时间量造成的,而是由学生通过学习获得的知识量造成的。我们通常会说知识是一个潜在的(htg0)变量——也就是说,我们不能直接测量它,但是我们可以看到它反映在我们可以测量的变量中(比如成绩和完成时间)。图[13.6](#fig:latentCausalGraph)显示了这一点。 - -图 13.6 显示了与上述相同的因果关系的图,但现在也显示了使用平方框的潜在变量(知识)。 - -在这里,我们可以说知识(htg0)介导了学习时间和成绩/完成时间之间的关系。这意味着,如果我们能够保持知识的恒定性(例如,通过服用一种能立即引起遗忘的药物),那么学习时间的长短将不再对成绩和完成时间产生影响。 - -请注意,如果我们简单地测量考试成绩和完成时间,我们通常会看到他们之间的负面关系,因为完成考试最快的人通常得到最高的分数。然而,如果我们将这种相关性解释为因果关系,这将告诉我们,为了获得更好的成绩,我们实际上应该更快地完成考试!这个例子说明了从非实验数据推断因果关系是多么困难。 - -在统计学和机器学习领域,有一个非常活跃的研究团体,目前正在研究从非实验数据推断因果关系的时间和方式问题。然而,这些方法往往需要强有力的假设,通常必须谨慎使用。 - -## 13.5 阅读建议 - -* [朱迪亚·珀尔的《为什么》(htg1)一书-对因果推理背后的思想的极好介绍。](http://bayes.cs.ucla.edu/WHY/) \ No newline at end of file diff --git a/docs/14.md b/docs/14.md index 2c1c4292746bde6eee01092e6cb58e64ffb08f58..643e0caad22f944c8c3dcecece600b7f182df9eb 100644 --- a/docs/14.md +++ b/docs/14.md @@ -69,4 +69,597 @@ corTestResult ## 0.63 ``` -相关性很高,但由于样本量很小,几乎没有达到统计显著性。 \ No newline at end of file +相关性很高,但由于样本量很小,几乎没有达到统计显著性。 + +## 14.1 线性回归 + +我们还可以使用一般线性模型来描述两个变量之间的关系,并决定这种关系是否具有统计意义;此外,该模型允许我们在给定独立变量的一些新值的情况下预测因变量的值。最重要的是,一般线性模型将允许我们建立包含多个独立变量的模型,而相关性只能告诉我们两个独立变量之间的关系。 + +我们为此使用的 GLM 的特定版本称为 _ 线性回归 _。术语 _ 回归 _ 是由 Francis Galton 创造的,他注意到,当他比较父母和他们的孩子的某些特征(如身高)时,极端父母的孩子(即非常高或非常矮的父母)通常比他们的父母更接近平均值。这是非常重要的一点,我们将回到下面。 + +线性回归模型的最简单版本(具有单个独立变量)可以表示为: + +![](img/b29bde499e20f8dc5fea373a03e1e864.jpg) + +![](img/35e5ca9978017f3c60bdb38fc9d6001f.jpg)值告诉我们,给定 x 中一个单位的变化,y 会发生多大的变化。截距![](img/c12eb7413067599b064fc399a191b496.jpg)是一个整体偏移量,它告诉我们当![](img/fd8e51c73f22442689e0a2862f0ebd49.jpg)时,y 会有多大的值;从我们早期的建模讨论中,您可能会记得,这对于建模过度非常重要。所有数据的大小,即使![](img/40779fc60a53ff2b70f832ec10cade09.jpg)从未真正达到零。误差项![](img/aeb302325ebc29add21f094ad38ad261.jpg)指的是模型一旦被拟合后所剩下的一切。如果我们想知道如何预测 y(我们称之为![](img/e6371f5e5f9dce74d256e6cd501a9bba.jpg)),那么我们可以删除错误项: + +![](img/3fa3edf43ee9dc24e91ea66923278e2a.jpg) + +图[14.2](#fig:LinearRegression)显示了应用于研究时间示例的此模型的示例。 + +![The linear regression solution for the study time data is shown in blue. The value of the intercept is equivalent to the predicted value of the y variable when the x variable is equal to zero; this is shown with a dotted black line. The value of beta is equal to the slope of the line -- that is, how much y changes for a unit change in x. This is shown schematically in the red dashed lines, which show the degree of increase in grade for a single unit increase in study time.](img/file81.png) + +图 14.2 研究时间数据的线性回归解用蓝色表示。当 x 变量等于零时,截距值等于 y 变量的预测值;这用虚线黑线表示。β值等于直线的斜率,也就是 x 单位变化的 y 变化量。红色虚线示意性地显示了这一点,它显示了学习时间单单位增加的年级增加程度。 + +# + +## 14.1.1 回归平均值 + +回归到平均值的概念 _ 是 Galton 对科学的重要贡献之一,在我们解释实验数据分析结果时,它仍然是理解的关键点。假设我们想研究阅读干预对贫困读者表现的影响。为了验证我们的假设,我们可能会去一所学校,在一些阅读测试中招募那些分布在 25%最底层的人,进行干预,然后检查他们的表现。假设干预实际上没有效果,每个人的阅读分数只是来自正态分布的独立样本。我们可以模拟:_ + +```r +# create simulated data for regression to the mean example + +nstudents <- 100 + +readingScores <- data.frame( + #random normal distribution of scores for test 1 + test1 = rnorm(n = nstudents, mean = 0, sd = 1) * 10 + 100, + #random normal distribution of scores for test 2 + test2 = rnorm(n = nstudents, mean = 0, sd = 1) * 10 + 100 +) + +# select the students in the bottom 25% on the first test +cutoff <- quantile(readingScores$test1, 0.25) + +readingScores <- + readingScores %>% + mutate(badTest1 = test1 < cutoff) %>% + dplyr::filter(badTest1 == TRUE) %>% + summarize( + test1mean = mean(test1), + test2mean = mean(test2) + ) %>% + pander() +``` + +如果我们看看第一次和第二次考试的平均成绩之间的差异,似乎干预对这些学生有了很大的帮助,因为他们的分数在考试中提高了超过 10 分!然而,我们知道事实上,学生根本没有进步,因为在这两种情况下,分数只是从随机正态分布中选择的。事实上,一些受试者在第一次考试中由于随机的机会得分很低。如果我们只根据第一次考试的分数来选择这些科目,那么在第二次考试中,即使没有培训的效果,他们也会回到整个组的平均水平。这就是为什么我们需要一个未经治疗的对照组(htg0)来解释随时间变化的读数;否则我们很可能会被回归到平均值所欺骗。 + +# + +## 14.1.2 估算线性回归参数 + +我们通常使用 _ 线性代数 _ 从数据中估计线性模型的参数,这是应用于向量和矩阵的代数形式。如果你不熟悉线性代数,不用担心——你实际上不需要在这里使用它,因为 R 将为我们做所有的工作。然而,线性代数中的一个简短的偏移可以提供一些关于模型参数如何在实践中估计的见解。 + +首先,让我们介绍向量和矩阵的概念;您已经在 r 的上下文中遇到过它们,但是我们将在这里回顾它们。矩阵是一组排列在一个正方形或矩形中的数字,这样就有一个或多个 _ 维度 _ 可供矩阵变化。通常在行中放置不同的观察单位(如人),在列中放置不同的变量。让我们从上面获取学习时间数据。我们可以将这些数字排列在一个矩阵中,这个矩阵有八行(每个学生一行)和两列(一列用于学习时间,一列用于成绩)。如果你在想“这听起来像 R 中的数据帧”,你是完全正确的!实际上,数据帧是矩阵的专用版本,我们可以使用`as.matrix()`函数将数据帧转换为矩阵。 + +```r +df_matrix <- + df %>% + dplyr::select(studyTime, grade) %>% + as.matrix() +``` + +我们可以将线性代数中的一般线性模型写成如下: + +![](img/b47f169cd7ef0c78414448bac001a0a6.jpg) + +这看起来非常像我们之前使用的方程,除了字母都是大写的,这意味着它们是向量这一事实。 + +我们知道等级数据进入 Y 矩阵,但是什么进入了![](img/1284cf6bcb6c2ffc47e2dd24cd1c51b8.jpg)矩阵?请记住,在我们最初讨论线性回归时,除了我们感兴趣的独立变量之外,我们还需要添加一个常量,因此我们的![](img/1284cf6bcb6c2ffc47e2dd24cd1c51b8.jpg)矩阵(我们称之为 _ 设计矩阵 _)需要包括两列:一列表示研究时间变量,另一列表示研究时间变量,以及 mn,每个个体具有相同的值(我们通常用所有值填充)。我们可以以图形方式查看结果设计矩阵(参见图[14.3](#fig:GLMmatrix))。 + +![A depiction of the linear model for the study time data in terms of matrix algebra.](img/file82.png) + +图 14.3 用矩阵代数描述研究时间数据的线性模型。 + +矩阵乘法规则告诉我们,矩阵的维数必须相互匹配;在这种情况下,设计矩阵的维数为 8(行)x 2(列),Y 变量的维数为 8 x 1。因此,![](img/50705df736e9a7919e768cf8c4e4f794.jpg)矩阵需要尺寸为 2 x 1,因为一个 8 x 2 矩阵乘以一个 2 x 1 矩阵会得到一个 8 x 1 矩阵(作为匹配的中间尺寸退出)。对![](img/50705df736e9a7919e768cf8c4e4f794.jpg)矩阵中的两个值的解释是,它们分别乘以研究时间和 1,得出每个个体的估计等级。我们还可以将线性模型视为每个个体的一组单独方程: + +![](img/b34b40b6caa1a0ffa9a4666235a83889.jpg) + +![](img/308261cdf56789240c353a5d3f95ed6b.jpg) + +…… + +![](img/29d2e96363621fe2ede1c42ad83cf420.jpg) + +记住,我们的目标是根据已知的![](img/1284cf6bcb6c2ffc47e2dd24cd1c51b8.jpg)和![](img/fc057c91da229543772de0dd6f8326f5.jpg)值确定![](img/50705df736e9a7919e768cf8c4e4f794.jpg)的最佳拟合值。这样做的一个简单方法是使用简单代数来求解![](img/50705df736e9a7919e768cf8c4e4f794.jpg)——这里我们去掉了错误项![](img/b7c1163d9869c571f333a165377b5b8b.jpg),因为它超出了我们的控制范围: + +![](img/04570ce8176451aeb53b7ebf3565e8d1.jpg) + +这里的挑战是![](img/1284cf6bcb6c2ffc47e2dd24cd1c51b8.jpg)和![](img/50705df736e9a7919e768cf8c4e4f794.jpg)现在是矩阵,而不是单个数字——但是线性代数的规则告诉我们如何除以矩阵,这与乘以矩阵的 _ 逆 _ 相同(称为![](img/c8620eef44ebe4b3eec1c2f8f9494e04.jpg))。我们可以在 r 中这样做: + +```r +# compute beta estimates using linear algebra + +Y <- as.matrix(df$grade) #create Y variable 8 x 1 matrix +X <- matrix(0, nrow = 8, ncol = 2) #create X variable 8 x 2 matrix +X[, 1] <- as.matrix(df$studyTime) #assign studyTime values to first column in X matrix +X[, 2] <- 1 #assign constant of 1 to second column in X matrix + +# compute inverse of X using ginv() +# %*% is the R matrix multiplication operator + +beta_hat <- ginv(X) %*% Y #multiple the inverse of X by Y +print(beta_hat) +``` + +```r +## [,1] +## [1,] 4.3 +## [2,] 76.2 +``` + +对于认真使用统计方法感兴趣的人,强烈鼓励他们花一些时间学习线性代数,因为它为几乎所有用于标准统计的工具提供了基础。 + +# + +## 14.1.3 相关性与回归的关系 + +相关系数与回归系数有着密切的关系。记住,皮尔逊的相关系数是以协方差的比值和 x 和 y 的标准差的乘积来计算的: + +![](img/1a40e134ca5017ebd57ad191de615055.jpg) + +而回归β的计算公式为: + +![](img/4c487dbaeabd216eeb84dcbe7d07c11e.jpg) + +基于这两个方程,我们可以得出![](img/b1840e5563155446c74b84de77d39e95.jpg)和![](img/9297928338bce8471b9d252e7666130f.jpg)之间的关系: + +![](img/e918d8831a6be4d574dbade04ed835ad.jpg) + +![](img/3d82f659f197f18edc09c90b5cb9b75f.jpg) + +也就是说,回归斜率等于相关值乘以 y 和 x 的标准差之比。这告诉我们的一件事是,当 x 和 y 的标准差相同时(例如,当数据被转换为 z 分数时),则相关估计等于 l 回归斜率估计。 + +# + +## 14.1.4 回归模型的标准误差 + +如果我们想对回归参数估计进行推断,那么我们还需要对它们的可变性进行估计。为了计算这一点,我们首先需要计算模型的 _ 残差方差 _ 或 _ 误差方差 _——也就是说,依赖变量中有多少可变性不是由模型解释的。模型残差计算如下: + +![](img/22245124dfea465fcb705facab8c0cc7.jpg) + +然后我们计算 _ 平方误差之和(sse)_: + +![](img/68eb8ec453beccc1646bd9ae8dab4d00.jpg) + +由此我们计算出 _ 的均方误差 _: + +![](img/f77b0029466ea257be9b74e678f8bcac.jpg) + +其中,自由度(![](img/090c32ecb38669de7278e89a9c89f6dd.jpg))是通过从观测值(![](img/9341d9048ac485106d2b2ee8de14876f.jpg))中减去估计参数(本例中为 2 个参数:![](img/a24cc78aeb3b937206aafd8333f3ffa6.jpg)和![](img/c1901c25b94eab74ccb483851ca51d1c.jpg))来确定的。一旦我们有了均方误差,我们就可以将模型的标准误差计算为: + +![](img/d7315e5f1f71bb622688a4b3242266f6.jpg) + +为了得到特定回归参数估计的标准误差,![](img/18cf59e1b4531c3903c64b55748e818d.jpg),我们需要根据 x 变量平方和的平方根重新调整模型的标准误差: + +![](img/313f4b6e58099e17fa915d2ab167c320.jpg) + +# + +## 14.1.5 回归参数的统计检验 + +一旦我们得到了参数估计值及其标准误差,我们就可以计算出一个 _t_ 统计数据,告诉我们观察到的参数估计值与无效假设下的某些预期值相比的可能性。在这种情况下,我们将根据无效假设(即![](img/c55ac7b4c829c515a6f42a84911924d0.jpg))进行测试: + +![](img/76f67043f53c45bb919124f3d55a9f5c.jpg) + +在 R 中,我们不需要手工计算这些值,因为它们由`lm()`函数自动返回给我们: + +```r +summary(lmResult) +``` + +```r +## +## Call: +## lm(formula = grade ~ studyTime, data = df) +## +## Residuals: +## Min 1Q Median 3Q Max +## -10.656 -2.719 0.125 4.703 7.469 +## +## Coefficients: +## Estimate Std. Error t value Pr(>|t|) +## (Intercept) 76.16 5.16 14.76 6.1e-06 *** +## studyTime 4.31 2.14 2.01 0.091 . +## --- +## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 +## +## Residual standard error: 6.4 on 6 degrees of freedom +## Multiple R-squared: 0.403, Adjusted R-squared: 0.304 +## F-statistic: 4.05 on 1 and 6 DF, p-value: 0.0907 +``` + +在这种情况下,我们看到截距明显不同于零(这不是很有趣),并且研究时间对成绩的影响微乎其微。 + +# + +## 14.1.6 模型拟合优度的量化 + +有时量化模型在整体上与数据的匹配程度是很有用的,而做到这一点的一种方法是询问模型对数据中的可变性有多大的解释。这是使用一个名为![](img/37b3c24ff77b4f85a3ac7fc7c3c88062.jpg)的值(也称为 _ 确定系数 _)来量化的。如果只有一个 x 变量,那么只需将相关系数平方即可轻松计算: + +![](img/43d74b95a17ab36e90d8505e81f0c6d5.jpg) + +对于我们的研究时间数据,![](img/37b3c24ff77b4f85a3ac7fc7c3c88062.jpg)=0.4,这意味着我们已经占了数据方差的 40%。 + +更一般地说,我们可以将![](img/37b3c24ff77b4f85a3ac7fc7c3c88062.jpg)看作是模型所占数据中方差分数的度量,可以通过将方差分解为多个分量来计算: + +![](img/afa9ea05b6b70a100f45f24d7f2bcb81.jpg) + +其中![](img/faf0cc0e13c7f76010a24da69ea6a995.jpg)是数据的方差(![](img/c592009395c2de830215c39f7bb6f97b.jpg)),并且![](img/1b171d25e28c908c537ba164ef44508f.jpg)和![](img/cada9ea63611321a50f83f4ff82d1a6f.jpg)如本章前面所示进行计算。利用这个,我们可以计算确定系数为: + +![](img/e25d838dfd5d7f16b1d3f91a14d32481.jpg) + +![](img/37b3c24ff77b4f85a3ac7fc7c3c88062.jpg)的一个小值告诉我们,即使模型拟合具有统计意义,它也只能解释数据中的少量信息。 + +## 14.2 安装更复杂的模型 + +我们通常希望了解多个变量对某些特定结果的影响,以及它们如何相互关联。在我们学习时间的例子中,假设我们发现一些学生以前参加过关于这个主题的课程。如果我们绘制他们的成绩(见图[14.4](#fig:StudytimeGradesPrior)),我们可以看到,在相同的学习时间内,那些上过一门课的学生比没有上过课的学生表现要好得多。 + +![The relationship between study time and grades, with color identifying whether each student had taken a previous course on the topic](img/file83.png) + +图 14.4 学习时间和成绩之间的关系,颜色标识每个学生是否上过该主题的课程 + +我们希望建立一个考虑到这一点的统计模型,我们可以通过扩展我们在上面建立的模型来实现这一点: + +![](img/7417fa3aaabd75734ceb8422a543f03a.jpg) + +为了模拟每个人是否有以前的类,我们使用我们称之为 _ 的伪编码 _ 来创建一个新变量,该变量的值为 1 表示以前有过一个类,否则为零。这意味着,对于以前上过课的人,我们只需将![](img/9b1b472f5e50a814654d7e603d299740.jpg)的值添加到他们的预测值中——也就是说,使用虚拟编码![](img/9b1b472f5e50a814654d7e603d299740.jpg)只是反映了两组人之间的平均值差异。我们对![](img/1bd70013553271dc3b9b449a5eb5a8a9.jpg)的估计反映了所有数据点的回归斜率——我们假设回归斜率是相同的,不管以前是否有过类(见图[14.5](#fig:LinearRegressionByPriorClass))。 + +```r +# perform linear regression for study time and prior class + +# must change priorClass to a factor variable +df$priorClass <- as.factor(df$priorClass) + +lmResultTwoVars <- lm(grade ~ studyTime + priorClass, data = df) +summary(lmResultTwoVars) +``` + +```r +## +## Call: +## lm(formula = grade ~ studyTime + priorClass, data = df) +## +## Residuals: +## 1 2 3 4 5 6 7 8 +## 3.5833 0.7500 -3.5833 -0.0833 0.7500 -6.4167 2.0833 2.9167 +## +## Coefficients: +## Estimate Std. Error t value Pr(>|t|) +## (Intercept) 70.08 3.77 18.60 8.3e-06 *** +## studyTime 5.00 1.37 3.66 0.015 * +## priorClass1 9.17 2.88 3.18 0.024 * +## --- +## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 +## +## Residual standard error: 4 on 5 degrees of freedom +## Multiple R-squared: 0.803, Adjusted R-squared: 0.724 +## F-statistic: 10.2 on 2 and 5 DF, p-value: 0.0173 +``` + +![The relation between study time and grade including prior experience as an additional component in the model. The blue line shows the slope relating grades to study time, and the black dotted line corresponds to the difference in means between the two groups.](img/file84.png) + +图 14.5 研究时间和年级之间的关系,包括作为模型中额外组成部分的先前经验。蓝线表示与学习时间相关的坡度,黑色虚线表示两组之间平均值的差异。 + +## 14.3 变量之间的相互作用 + +在前面的模型中,我们假设两组的学习时间对成绩的影响(即回归斜率)是相同的。但是,在某些情况下,我们可以想象一个变量的效果可能会因另一个变量的值而不同,我们称之为变量之间的 _ 交互 _。 + +![The relationship between caffeine and public speaking](img/file85.png) + +图 14.6 咖啡因与公共演讲的关系 + +让我们用一个新的例子来问这个问题:咖啡因对公众演讲的影响是什么?首先,让我们生成一些数据并绘制它们。从图[14.6](#fig:CaffeineSpeaking)来看,似乎没有关系,我们可以通过对数据进行线性回归来确认: + +```r +# perform linear regression with caffeine as independent variable +lmResultCaffeine <- lm(speaking ~ caffeine, data = df) +summary(lmResultCaffeine) +``` + +```r +## +## Call: +## lm(formula = speaking ~ caffeine, data = df) +## +## Residuals: +## Min 1Q Median 3Q Max +## -33.10 -16.02 5.01 16.45 26.98 +## +## Coefficients: +## Estimate Std. Error t value Pr(>|t|) +## (Intercept) -7.413 9.165 -0.81 0.43 +## caffeine 0.168 0.151 1.11 0.28 +## +## Residual standard error: 19 on 18 degrees of freedom +## Multiple R-squared: 0.0642, Adjusted R-squared: 0.0122 +## F-statistic: 1.23 on 1 and 18 DF, p-value: 0.281 +``` + +但现在让我们假设,我们发现研究表明焦虑和非焦虑的人对咖啡因的反应不同。首先,让我们分别为焦虑和非焦虑的人绘制数据。 + +![The relationship between caffeine and public speaking, with anxiety represented by the color of the data points](img/file86.png) + +图 14.7 咖啡因与公共演讲的关系,数据点颜色代表焦虑 + +从图[14.7](#fig:CaffeineSpeakingAnxiety)可以看出,两组人的言语和咖啡因之间的关系是不同的,咖啡因改善了无焦虑人群的表现,降低了焦虑人群的表现。我们想创建一个解决这个问题的统计模型。首先,让我们看看如果在模型中包含焦虑会发生什么。 + +```r +# compute linear regression adding anxiety to model +lmResultCafAnx <- lm(speaking ~ caffeine + anxiety, data = df) +summary(lmResultCafAnx) +``` + +```r +## +## Call: +## lm(formula = speaking ~ caffeine + anxiety, data = df) +## +## Residuals: +## Min 1Q Median 3Q Max +## -32.97 -9.74 1.35 10.53 25.36 +## +## Coefficients: +## Estimate Std. Error t value Pr(>|t|) +## (Intercept) -12.581 9.197 -1.37 0.19 +## caffeine 0.131 0.145 0.91 0.38 +## anxietynotAnxious 14.233 8.232 1.73 0.10 +## +## Residual standard error: 18 on 17 degrees of freedom +## Multiple R-squared: 0.204, Adjusted R-squared: 0.11 +## F-statistic: 2.18 on 2 and 17 DF, p-value: 0.144 +``` + +在这里,我们看到咖啡因和焦虑都没有明显的效果,这看起来有点令人困惑。问题是,这一模型试图符合两组人对咖啡因说话的同一条线。如果我们想使用单独的行来拟合它们,我们需要在模型中包含一个 _ 交互 _,这相当于为两个组中的每个组拟合不同的行;在 r 中,这由![](img/28ec51e742166ea3400be6e7343bbfa5.jpg)符号表示。 + +```r +# compute linear regression including caffeine X anxiety interaction +lmResultInteraction <- lm( + speaking ~ caffeine + anxiety + caffeine * anxiety, + data = df +) +summary(lmResultInteraction) +``` + +```r +## +## Call: +## lm(formula = speaking ~ caffeine + anxiety + caffeine * anxiety, +## data = df) +## +## Residuals: +## Min 1Q Median 3Q Max +## -11.385 -7.103 -0.444 6.171 13.458 +## +## Coefficients: +## Estimate Std. Error t value Pr(>|t|) +## (Intercept) 17.4308 5.4301 3.21 0.00546 ** +## caffeine -0.4742 0.0966 -4.91 0.00016 *** +## anxietynotAnxious -43.4487 7.7914 -5.58 4.2e-05 *** +## caffeine:anxietynotAnxious 1.0839 0.1293 8.38 3.0e-07 *** +## --- +## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 +## +## Residual standard error: 8.1 on 16 degrees of freedom +## Multiple R-squared: 0.852, Adjusted R-squared: 0.825 +## F-statistic: 30.8 on 3 and 16 DF, p-value: 7.01e-07 +``` + +从这些结果中,我们发现咖啡因和焦虑都有显著的影响(我们称之为 _ 主要影响 _),以及咖啡因和焦虑之间的相互作用。图[14.8](#fig:CaffeineAnxietyInteraction)显示了每组的独立回归线。 + +![The relationship between public speaking and caffeine, including an interaction with anxiety. This results in two lines that separately model the slope for each group.](img/file87.png) + +图 14.8 公众演讲和咖啡因之间的关系,包括与焦虑的互动。这将生成两条线,分别为每个组建模坡度。 + +有时我们想比较两个不同模型的相对拟合,以确定哪个模型更好;我们将其称为 _ 模型比较 _。对于上面的模型,我们可以使用 r 中的`anova()`命令比较模型的拟合优度(有无交互作用): + +```r +anova(lmResultCafAnx, lmResultInteraction) +``` + +```r +## Analysis of Variance Table +## +## Model 1: speaking ~ caffeine + anxiety +## Model 2: speaking ~ caffeine + anxiety + caffeine * anxiety +## Res.Df RSS Df Sum of Sq F Pr(>F) +## 1 17 5639 +## 2 16 1046 1 4593 70.3 3e-07 *** +## --- +## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 +``` + +这告诉我们,有很好的证据表明,比起没有交互作用的模型,更倾向于有交互作用的模型。在这种情况下,模型比较相对简单,因为这两个模型是 _ 嵌套的 _——其中一个模型是另一个模型的简化版本。与非嵌套模型的模型比较可能会变得更加复杂。 + +## 14.4“预测”的真正含义是什么? + +当我们谈论日常生活中的“预测”时,我们通常指的是在看到数据之前估计某个变量值的能力。然而,该术语通常在线性回归的背景下用于指模型与数据的拟合;估计值(![](img/e6371f5e5f9dce74d256e6cd501a9bba.jpg))有时被称为“预测”,独立变量被称为“预测”。这有一个不幸的含义,因为它意味着我们的模型还应该能够预测未来新数据点的值。实际上,模型与用于获取参数的数据集的匹配几乎总是优于模型与新数据集的匹配(copas 1983)。 + +作为一个例子,让我们从 NHANES 中选取 48 名儿童为样本,并拟合一个体重回归模型,该模型包括几个回归因子(年龄、身高、看电视和使用电脑的时间以及家庭收入)及其相互作用。 + +```r +# create dataframe with children with complete data on all variables +NHANES_child <- + NHANES %>% + drop_na(Height, Weight, TVHrsDayChild, HHIncomeMid, CompHrsDayChild, Age) %>% + dplyr::filter(Age < 18) +``` + +```r +# create function to sample data and compute regression on in-sample and out-of-sample data + +get_sample_predictions <- function(sample_size, shuffle = FALSE) { + # generate a sample from NHANES + orig_sample <- + NHANES_child %>% + sample_n(sample_size) + + # if shuffle is turned on, then randomly shuffle the weight variable + if (shuffle) { + orig_sample$Weight <- sample(orig_sample$Weight) + } + # compute the regression line for Weight, as a function of several + # other variables (with all possible interactions between variables) + heightRegressOrig <- lm( + Weight ~ Height * TVHrsDayChild * CompHrsDayChild * HHIncomeMid * Age, + data = orig_sample + ) + # compute the predictions + pred_orig <- predict(heightRegressOrig) + + # create a new sample from the same population + new_sample <- + NHANES_child %>% + sample_n(sample_size) + + # use the model fom the original sample to predict the + # Weight values for the new sample + pred_new <- predict(heightRegressOrig, new_sample) + + # return r-squared and rmse for original and new data + return(c( + cor(pred_orig, orig_sample$Weight)**2, + cor(pred_new, new_sample$Weight)**2, + sqrt(mean((pred_orig - orig_sample$Weight)**2)), + sqrt(mean((pred_new - new_sample$Weight)**2)) + )) +} +``` + +```r +# implement the function +sim_results <- + replicate(100, get_sample_predictions(sample_size = 48, shuffle = FALSE)) + +sim_results <- + t(sim_results) %>% + data.frame() + +mean_rsquared <- + sim_results %>% + summarize( + rmse_original_data = mean(X3), + rmse_new_data = mean(X4) + ) + +pander(mean_rsquared) +``` + + +| RMSE_ 原始数据 | RMSE_ 新数据 | +| --- | --- | +| 2.97 条 | 25.72 美元 | + +在这里,我们看到,虽然模型与原始数据相匹配显示出非常好的拟合(每个人只减去几磅),但同一个模型在预测从同一人群中抽样的新儿童的体重值(每个人减去 25 磅以上)方面做得更差。这是因为我们指定的模型非常复杂,因为它不仅包括每个单独的变量,而且还包括它们的所有可能组合(即它们的 _ 交互 _),从而产生一个具有 32 个参数的模型。由于这几乎和数据点一样多的系数(即 48 个孩子的身高),模型 _ 对数据进行了过度拟合 _,就像我们在[5.4 节](#overfitting)中最初的过度拟合示例中的复杂多项式曲线一样。 + +另一种观察过度拟合效果的方法是观察如果我们随机地改变权重变量的值会发生什么。随机改变该值应该使得无法从其他变量预测权重,因为它们不应该有系统的关系。 + +```r +print("using shuffled y variable to simulate null effect") +``` + +```r +## [1] "using shuffled y variable to simulate null effect" +``` + +```r +sim_results <- + replicate(100, get_sample_predictions(sample_size = 48, shuffle = TRUE)) + +sim_results <- + t(sim_results) %>% + data.frame() + +mean_rsquared <- + sim_results %>% + summarize( + rmse_original_data = mean(X3), + rmse_new_data = mean(X4) + ) +pander(mean_rsquared) +``` + + +| rmse_original_data | rmse_new_data | +| --- | --- | +| 7.56 条 | 第 60.1 条 | + +这向我们表明,即使没有真正的关系需要建模(因为疏解应该消除了关系),复杂的模型在预测中仍然显示非常低的错误,因为它适合特定数据集中的噪声。然而,当该模型应用于一个新的数据集时,我们会发现错误要大得多,这是应该的。 + +# + +## 14.4.1 交叉验证 + +为了帮助解决过拟合问题而开发的一种方法是 _ 交叉验证 _。这种技术通常用于机器学习领域,该领域的重点是构建能够很好地概括为新数据的模型,即使我们没有新的数据集来测试模型。交叉验证背后的想法是,我们反复地适应我们的模型,每次都会遗漏数据的一个子集,然后测试模型预测每个被保留的子集中值的能力。 + +![A schematic of the cross-validation procedure.](img/file88.png) + +图 14.9 交叉验证程序示意图。 + +让我们看看这对于我们的重量预测示例是如何工作的。在这种情况下,我们将执行 12 倍交叉验证,这意味着我们将把数据分成 12 个子集,然后将模型拟合 12 次,在每种情况下,去掉其中一个子集,然后测试模型准确预测所持有的因变量值的能力。-找出数据点。R 中的`caret`包使我们能够轻松地跨数据集运行交叉验证: + +```r +# create a function to run cross-validation +# returns the r-squared for the out-of-sample prediction + +compute_cv <- function(d, nfolds = 12) { + # based on https://quantdev.ssri.psu.edu/tutorials/cross-validation-tutorial + train_ctrl <- trainControl(method = "cv", number = nfolds) + model_caret <- train( + Weight ~ Height * TVHrsDayChild * CompHrsDayChild * HHIncomeMid * Age, + data = d, + trControl = train_ctrl, # folds + method = "lm" + ) # specifying regression model + + r2_cv <- mean(model_caret$resample$Rsquared) + rmse_cv <- mean(model_caret$resample$RMSE) + return(c(r2_cv, rmse_cv)) +} +``` + +使用此函数,我们可以对来自 nhanes 数据集的 100 个样本运行交叉验证,并计算交叉验证的 RMSE,以及原始数据和新数据集的 RMSE,正如我们上面计算的那样。 + +```r +#implement the function +sim_results <- + replicate(100, get_sample_predictions_cv(sample_size = 48, shuffle = FALSE)) + +sim_results <- + t(sim_results) %>% + data.frame() + +mean_rsquared <- + sim_results %>% + summarize( + mse_original_data = mean(X4), + mse_new_data = mean(X5), + mse_crossvalidation = mean(X6) + ) +pander(mean_rsquared) +``` + + +| MSE 原始数据 | MSE 新数据 | MSE 交叉验证 | +| --- | --- | --- | +| 2.98 年 | 21.64 条 | 29.29 条 | + +在这里,我们看到交叉验证给了我们一个预测准确性的估计,它比我们用原始数据集看到的膨胀的准确性更接近我们用一个全新数据集看到的结果——事实上,它甚至比新数据集的平均值更悲观。可能是因为只有部分数据被用来训练每个模型。我们还可以确认,当因变量随机变动时,交叉验证能准确估计预测精度: + + +| rmse_original_data | rmse_new_data | RMSE 交叉验证 | +| --- | --- | --- | +| 第 7.9 条 | 第 73.7 条 | 75.31 条 | + +在这里,我们再次看到交叉验证给了我们一个预测准确性的评估,这与我们对新数据的预期更为接近,而且更为悲观。 + +正确使用交叉验证是很困难的,建议在实际使用之前咨询专家。然而,本节希望向您展示三件事: + +* “预言”并不总是意味着你认为它意味着什么。 +* 复杂的模型会严重地过度拟合数据,这样即使没有真正的预测信号,人们也能看到似乎很好的预测。 +* 除非使用适当的方法,否则您应该非常怀疑地查看有关预测准确性的声明。 + +## 14.5 阅读建议 + +* [统计学习要素:数据挖掘、推理和预测(第二版)](https://web.stanford.edu/~hastie/Papers/ESLII.pdf)——机器学习方法圣经,在线免费提供。 \ No newline at end of file diff --git a/docs/14.x2.md b/docs/14.x2.md deleted file mode 100644 index 643e0caad22f944c8c3dcecece600b7f182df9eb..0000000000000000000000000000000000000000 --- a/docs/14.x2.md +++ /dev/null @@ -1,665 +0,0 @@ -# 14 一般线性模型 - -请记住,在本书的早期,我们描述了统计的基本模型: - -![](img/7fc06dc3f40e34d7510e8f585719ece6.jpg) - -其中,我们的一般目标是找到最大限度地减少错误的模型,并受一些其他约束(例如保持模型相对简单,以便我们可以在特定数据集之外进行归纳)。在本章中,我们将重点介绍这种方法的特殊实现,即 _ 一般线性模型 _(或 GLM)。您已经在前面一章中看到了将模型拟合到数据的一般线性模型,我们在 nhanes 数据集中将高度建模为年龄的函数;在这里,我们将更全面地介绍 GLM 的概念及其许多用途。 - -在讨论一般线性模型之前,我们先定义两个对我们的讨论很重要的术语: - -* _ 因变量 _:这是我们的模型要解释的结果变量(通常称为 _y_) -* _ 自变量 _:这是一个我们希望用来解释因变量的变量(通常称为 _x_)。 - -可能有多个自变量,但对于本课程,我们的分析中只有一个因变量。 - -一般线性模型是由独立变量的 _ 线性组合 _ 组成的,每个独立变量乘以一个权重(通常称为希腊字母 beta-![](img/50705df736e9a7919e768cf8c4e4f794.jpg)),确定相对贡献。模型预测的自变量。 - -作为一个例子,让我们为学习时间和考试成绩之间的关系生成一些模拟数据(参见图[14.1](#fig:StudytimeGrades))。 - -```r -# create simulated data for example -set.seed(12345) - -# the number of points that having a prior class increases grades -betas <- c(6, 5) - -df <- - tibble( - studyTime = c(2, 3, 5, 6, 6, 8, 10, 12) / 3, - priorClass = c(0, 1, 1, 0, 1, 0, 1, 0) - ) %>% - mutate( - grade = - studyTime * betas[1] + - priorClass * betas[2] + - round(rnorm(8, mean = 70, sd = 5)) - ) -``` - -![Relation between study time and grades](img/file80.png) - -图 14.1 学习时间与成绩的关系 - -鉴于这些数据,我们可能希望参与三项基本统计活动: - -* _ 描述一下 _:年级和学习时间之间的关系有多强? -* _ 决定 _:年级和学习时间之间有统计学意义的关系吗? -* _ 预测 _:给定特定的学习时间,我们期望达到什么级别? - -在最后一章中,我们学习了如何使用相关系数来描述两个变量之间的关系,因此我们可以使用它来描述这里的关系,并测试相关性是否具有统计意义: - -```r -# compute correlation between grades and study time -corTestResult <- cor.test(df$grade, df$studyTime, alternative = "greater") -corTestResult -``` - -```r -## -## Pearson's product-moment correlation -## -## data: df$grade and df$studyTime -## t = 2, df = 6, p-value = 0.05 -## alternative hypothesis: true correlation is greater than 0 -## 95 percent confidence interval: -## 0.014 1.000 -## sample estimates: -## cor -## 0.63 -``` - -相关性很高,但由于样本量很小,几乎没有达到统计显著性。 - -## 14.1 线性回归 - -我们还可以使用一般线性模型来描述两个变量之间的关系,并决定这种关系是否具有统计意义;此外,该模型允许我们在给定独立变量的一些新值的情况下预测因变量的值。最重要的是,一般线性模型将允许我们建立包含多个独立变量的模型,而相关性只能告诉我们两个独立变量之间的关系。 - -我们为此使用的 GLM 的特定版本称为 _ 线性回归 _。术语 _ 回归 _ 是由 Francis Galton 创造的,他注意到,当他比较父母和他们的孩子的某些特征(如身高)时,极端父母的孩子(即非常高或非常矮的父母)通常比他们的父母更接近平均值。这是非常重要的一点,我们将回到下面。 - -线性回归模型的最简单版本(具有单个独立变量)可以表示为: - -![](img/b29bde499e20f8dc5fea373a03e1e864.jpg) - -![](img/35e5ca9978017f3c60bdb38fc9d6001f.jpg)值告诉我们,给定 x 中一个单位的变化,y 会发生多大的变化。截距![](img/c12eb7413067599b064fc399a191b496.jpg)是一个整体偏移量,它告诉我们当![](img/fd8e51c73f22442689e0a2862f0ebd49.jpg)时,y 会有多大的值;从我们早期的建模讨论中,您可能会记得,这对于建模过度非常重要。所有数据的大小,即使![](img/40779fc60a53ff2b70f832ec10cade09.jpg)从未真正达到零。误差项![](img/aeb302325ebc29add21f094ad38ad261.jpg)指的是模型一旦被拟合后所剩下的一切。如果我们想知道如何预测 y(我们称之为![](img/e6371f5e5f9dce74d256e6cd501a9bba.jpg)),那么我们可以删除错误项: - -![](img/3fa3edf43ee9dc24e91ea66923278e2a.jpg) - -图[14.2](#fig:LinearRegression)显示了应用于研究时间示例的此模型的示例。 - -![The linear regression solution for the study time data is shown in blue. The value of the intercept is equivalent to the predicted value of the y variable when the x variable is equal to zero; this is shown with a dotted black line. The value of beta is equal to the slope of the line -- that is, how much y changes for a unit change in x. This is shown schematically in the red dashed lines, which show the degree of increase in grade for a single unit increase in study time.](img/file81.png) - -图 14.2 研究时间数据的线性回归解用蓝色表示。当 x 变量等于零时,截距值等于 y 变量的预测值;这用虚线黑线表示。β值等于直线的斜率,也就是 x 单位变化的 y 变化量。红色虚线示意性地显示了这一点,它显示了学习时间单单位增加的年级增加程度。 - -# - -## 14.1.1 回归平均值 - -回归到平均值的概念 _ 是 Galton 对科学的重要贡献之一,在我们解释实验数据分析结果时,它仍然是理解的关键点。假设我们想研究阅读干预对贫困读者表现的影响。为了验证我们的假设,我们可能会去一所学校,在一些阅读测试中招募那些分布在 25%最底层的人,进行干预,然后检查他们的表现。假设干预实际上没有效果,每个人的阅读分数只是来自正态分布的独立样本。我们可以模拟:_ - -```r -# create simulated data for regression to the mean example - -nstudents <- 100 - -readingScores <- data.frame( - #random normal distribution of scores for test 1 - test1 = rnorm(n = nstudents, mean = 0, sd = 1) * 10 + 100, - #random normal distribution of scores for test 2 - test2 = rnorm(n = nstudents, mean = 0, sd = 1) * 10 + 100 -) - -# select the students in the bottom 25% on the first test -cutoff <- quantile(readingScores$test1, 0.25) - -readingScores <- - readingScores %>% - mutate(badTest1 = test1 < cutoff) %>% - dplyr::filter(badTest1 == TRUE) %>% - summarize( - test1mean = mean(test1), - test2mean = mean(test2) - ) %>% - pander() -``` - -如果我们看看第一次和第二次考试的平均成绩之间的差异,似乎干预对这些学生有了很大的帮助,因为他们的分数在考试中提高了超过 10 分!然而,我们知道事实上,学生根本没有进步,因为在这两种情况下,分数只是从随机正态分布中选择的。事实上,一些受试者在第一次考试中由于随机的机会得分很低。如果我们只根据第一次考试的分数来选择这些科目,那么在第二次考试中,即使没有培训的效果,他们也会回到整个组的平均水平。这就是为什么我们需要一个未经治疗的对照组(htg0)来解释随时间变化的读数;否则我们很可能会被回归到平均值所欺骗。 - -# - -## 14.1.2 估算线性回归参数 - -我们通常使用 _ 线性代数 _ 从数据中估计线性模型的参数,这是应用于向量和矩阵的代数形式。如果你不熟悉线性代数,不用担心——你实际上不需要在这里使用它,因为 R 将为我们做所有的工作。然而,线性代数中的一个简短的偏移可以提供一些关于模型参数如何在实践中估计的见解。 - -首先,让我们介绍向量和矩阵的概念;您已经在 r 的上下文中遇到过它们,但是我们将在这里回顾它们。矩阵是一组排列在一个正方形或矩形中的数字,这样就有一个或多个 _ 维度 _ 可供矩阵变化。通常在行中放置不同的观察单位(如人),在列中放置不同的变量。让我们从上面获取学习时间数据。我们可以将这些数字排列在一个矩阵中,这个矩阵有八行(每个学生一行)和两列(一列用于学习时间,一列用于成绩)。如果你在想“这听起来像 R 中的数据帧”,你是完全正确的!实际上,数据帧是矩阵的专用版本,我们可以使用`as.matrix()`函数将数据帧转换为矩阵。 - -```r -df_matrix <- - df %>% - dplyr::select(studyTime, grade) %>% - as.matrix() -``` - -我们可以将线性代数中的一般线性模型写成如下: - -![](img/b47f169cd7ef0c78414448bac001a0a6.jpg) - -这看起来非常像我们之前使用的方程,除了字母都是大写的,这意味着它们是向量这一事实。 - -我们知道等级数据进入 Y 矩阵,但是什么进入了![](img/1284cf6bcb6c2ffc47e2dd24cd1c51b8.jpg)矩阵?请记住,在我们最初讨论线性回归时,除了我们感兴趣的独立变量之外,我们还需要添加一个常量,因此我们的![](img/1284cf6bcb6c2ffc47e2dd24cd1c51b8.jpg)矩阵(我们称之为 _ 设计矩阵 _)需要包括两列:一列表示研究时间变量,另一列表示研究时间变量,以及 mn,每个个体具有相同的值(我们通常用所有值填充)。我们可以以图形方式查看结果设计矩阵(参见图[14.3](#fig:GLMmatrix))。 - -![A depiction of the linear model for the study time data in terms of matrix algebra.](img/file82.png) - -图 14.3 用矩阵代数描述研究时间数据的线性模型。 - -矩阵乘法规则告诉我们,矩阵的维数必须相互匹配;在这种情况下,设计矩阵的维数为 8(行)x 2(列),Y 变量的维数为 8 x 1。因此,![](img/50705df736e9a7919e768cf8c4e4f794.jpg)矩阵需要尺寸为 2 x 1,因为一个 8 x 2 矩阵乘以一个 2 x 1 矩阵会得到一个 8 x 1 矩阵(作为匹配的中间尺寸退出)。对![](img/50705df736e9a7919e768cf8c4e4f794.jpg)矩阵中的两个值的解释是,它们分别乘以研究时间和 1,得出每个个体的估计等级。我们还可以将线性模型视为每个个体的一组单独方程: - -![](img/b34b40b6caa1a0ffa9a4666235a83889.jpg) - -![](img/308261cdf56789240c353a5d3f95ed6b.jpg) - -…… - -![](img/29d2e96363621fe2ede1c42ad83cf420.jpg) - -记住,我们的目标是根据已知的![](img/1284cf6bcb6c2ffc47e2dd24cd1c51b8.jpg)和![](img/fc057c91da229543772de0dd6f8326f5.jpg)值确定![](img/50705df736e9a7919e768cf8c4e4f794.jpg)的最佳拟合值。这样做的一个简单方法是使用简单代数来求解![](img/50705df736e9a7919e768cf8c4e4f794.jpg)——这里我们去掉了错误项![](img/b7c1163d9869c571f333a165377b5b8b.jpg),因为它超出了我们的控制范围: - -![](img/04570ce8176451aeb53b7ebf3565e8d1.jpg) - -这里的挑战是![](img/1284cf6bcb6c2ffc47e2dd24cd1c51b8.jpg)和![](img/50705df736e9a7919e768cf8c4e4f794.jpg)现在是矩阵,而不是单个数字——但是线性代数的规则告诉我们如何除以矩阵,这与乘以矩阵的 _ 逆 _ 相同(称为![](img/c8620eef44ebe4b3eec1c2f8f9494e04.jpg))。我们可以在 r 中这样做: - -```r -# compute beta estimates using linear algebra - -Y <- as.matrix(df$grade) #create Y variable 8 x 1 matrix -X <- matrix(0, nrow = 8, ncol = 2) #create X variable 8 x 2 matrix -X[, 1] <- as.matrix(df$studyTime) #assign studyTime values to first column in X matrix -X[, 2] <- 1 #assign constant of 1 to second column in X matrix - -# compute inverse of X using ginv() -# %*% is the R matrix multiplication operator - -beta_hat <- ginv(X) %*% Y #multiple the inverse of X by Y -print(beta_hat) -``` - -```r -## [,1] -## [1,] 4.3 -## [2,] 76.2 -``` - -对于认真使用统计方法感兴趣的人,强烈鼓励他们花一些时间学习线性代数,因为它为几乎所有用于标准统计的工具提供了基础。 - -# - -## 14.1.3 相关性与回归的关系 - -相关系数与回归系数有着密切的关系。记住,皮尔逊的相关系数是以协方差的比值和 x 和 y 的标准差的乘积来计算的: - -![](img/1a40e134ca5017ebd57ad191de615055.jpg) - -而回归β的计算公式为: - -![](img/4c487dbaeabd216eeb84dcbe7d07c11e.jpg) - -基于这两个方程,我们可以得出![](img/b1840e5563155446c74b84de77d39e95.jpg)和![](img/9297928338bce8471b9d252e7666130f.jpg)之间的关系: - -![](img/e918d8831a6be4d574dbade04ed835ad.jpg) - -![](img/3d82f659f197f18edc09c90b5cb9b75f.jpg) - -也就是说,回归斜率等于相关值乘以 y 和 x 的标准差之比。这告诉我们的一件事是,当 x 和 y 的标准差相同时(例如,当数据被转换为 z 分数时),则相关估计等于 l 回归斜率估计。 - -# - -## 14.1.4 回归模型的标准误差 - -如果我们想对回归参数估计进行推断,那么我们还需要对它们的可变性进行估计。为了计算这一点,我们首先需要计算模型的 _ 残差方差 _ 或 _ 误差方差 _——也就是说,依赖变量中有多少可变性不是由模型解释的。模型残差计算如下: - -![](img/22245124dfea465fcb705facab8c0cc7.jpg) - -然后我们计算 _ 平方误差之和(sse)_: - -![](img/68eb8ec453beccc1646bd9ae8dab4d00.jpg) - -由此我们计算出 _ 的均方误差 _: - -![](img/f77b0029466ea257be9b74e678f8bcac.jpg) - -其中,自由度(![](img/090c32ecb38669de7278e89a9c89f6dd.jpg))是通过从观测值(![](img/9341d9048ac485106d2b2ee8de14876f.jpg))中减去估计参数(本例中为 2 个参数:![](img/a24cc78aeb3b937206aafd8333f3ffa6.jpg)和![](img/c1901c25b94eab74ccb483851ca51d1c.jpg))来确定的。一旦我们有了均方误差,我们就可以将模型的标准误差计算为: - -![](img/d7315e5f1f71bb622688a4b3242266f6.jpg) - -为了得到特定回归参数估计的标准误差,![](img/18cf59e1b4531c3903c64b55748e818d.jpg),我们需要根据 x 变量平方和的平方根重新调整模型的标准误差: - -![](img/313f4b6e58099e17fa915d2ab167c320.jpg) - -# - -## 14.1.5 回归参数的统计检验 - -一旦我们得到了参数估计值及其标准误差,我们就可以计算出一个 _t_ 统计数据,告诉我们观察到的参数估计值与无效假设下的某些预期值相比的可能性。在这种情况下,我们将根据无效假设(即![](img/c55ac7b4c829c515a6f42a84911924d0.jpg))进行测试: - -![](img/76f67043f53c45bb919124f3d55a9f5c.jpg) - -在 R 中,我们不需要手工计算这些值,因为它们由`lm()`函数自动返回给我们: - -```r -summary(lmResult) -``` - -```r -## -## Call: -## lm(formula = grade ~ studyTime, data = df) -## -## Residuals: -## Min 1Q Median 3Q Max -## -10.656 -2.719 0.125 4.703 7.469 -## -## Coefficients: -## Estimate Std. Error t value Pr(>|t|) -## (Intercept) 76.16 5.16 14.76 6.1e-06 *** -## studyTime 4.31 2.14 2.01 0.091 . -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -## -## Residual standard error: 6.4 on 6 degrees of freedom -## Multiple R-squared: 0.403, Adjusted R-squared: 0.304 -## F-statistic: 4.05 on 1 and 6 DF, p-value: 0.0907 -``` - -在这种情况下,我们看到截距明显不同于零(这不是很有趣),并且研究时间对成绩的影响微乎其微。 - -# - -## 14.1.6 模型拟合优度的量化 - -有时量化模型在整体上与数据的匹配程度是很有用的,而做到这一点的一种方法是询问模型对数据中的可变性有多大的解释。这是使用一个名为![](img/37b3c24ff77b4f85a3ac7fc7c3c88062.jpg)的值(也称为 _ 确定系数 _)来量化的。如果只有一个 x 变量,那么只需将相关系数平方即可轻松计算: - -![](img/43d74b95a17ab36e90d8505e81f0c6d5.jpg) - -对于我们的研究时间数据,![](img/37b3c24ff77b4f85a3ac7fc7c3c88062.jpg)=0.4,这意味着我们已经占了数据方差的 40%。 - -更一般地说,我们可以将![](img/37b3c24ff77b4f85a3ac7fc7c3c88062.jpg)看作是模型所占数据中方差分数的度量,可以通过将方差分解为多个分量来计算: - -![](img/afa9ea05b6b70a100f45f24d7f2bcb81.jpg) - -其中![](img/faf0cc0e13c7f76010a24da69ea6a995.jpg)是数据的方差(![](img/c592009395c2de830215c39f7bb6f97b.jpg)),并且![](img/1b171d25e28c908c537ba164ef44508f.jpg)和![](img/cada9ea63611321a50f83f4ff82d1a6f.jpg)如本章前面所示进行计算。利用这个,我们可以计算确定系数为: - -![](img/e25d838dfd5d7f16b1d3f91a14d32481.jpg) - -![](img/37b3c24ff77b4f85a3ac7fc7c3c88062.jpg)的一个小值告诉我们,即使模型拟合具有统计意义,它也只能解释数据中的少量信息。 - -## 14.2 安装更复杂的模型 - -我们通常希望了解多个变量对某些特定结果的影响,以及它们如何相互关联。在我们学习时间的例子中,假设我们发现一些学生以前参加过关于这个主题的课程。如果我们绘制他们的成绩(见图[14.4](#fig:StudytimeGradesPrior)),我们可以看到,在相同的学习时间内,那些上过一门课的学生比没有上过课的学生表现要好得多。 - -![The relationship between study time and grades, with color identifying whether each student had taken a previous course on the topic](img/file83.png) - -图 14.4 学习时间和成绩之间的关系,颜色标识每个学生是否上过该主题的课程 - -我们希望建立一个考虑到这一点的统计模型,我们可以通过扩展我们在上面建立的模型来实现这一点: - -![](img/7417fa3aaabd75734ceb8422a543f03a.jpg) - -为了模拟每个人是否有以前的类,我们使用我们称之为 _ 的伪编码 _ 来创建一个新变量,该变量的值为 1 表示以前有过一个类,否则为零。这意味着,对于以前上过课的人,我们只需将![](img/9b1b472f5e50a814654d7e603d299740.jpg)的值添加到他们的预测值中——也就是说,使用虚拟编码![](img/9b1b472f5e50a814654d7e603d299740.jpg)只是反映了两组人之间的平均值差异。我们对![](img/1bd70013553271dc3b9b449a5eb5a8a9.jpg)的估计反映了所有数据点的回归斜率——我们假设回归斜率是相同的,不管以前是否有过类(见图[14.5](#fig:LinearRegressionByPriorClass))。 - -```r -# perform linear regression for study time and prior class - -# must change priorClass to a factor variable -df$priorClass <- as.factor(df$priorClass) - -lmResultTwoVars <- lm(grade ~ studyTime + priorClass, data = df) -summary(lmResultTwoVars) -``` - -```r -## -## Call: -## lm(formula = grade ~ studyTime + priorClass, data = df) -## -## Residuals: -## 1 2 3 4 5 6 7 8 -## 3.5833 0.7500 -3.5833 -0.0833 0.7500 -6.4167 2.0833 2.9167 -## -## Coefficients: -## Estimate Std. Error t value Pr(>|t|) -## (Intercept) 70.08 3.77 18.60 8.3e-06 *** -## studyTime 5.00 1.37 3.66 0.015 * -## priorClass1 9.17 2.88 3.18 0.024 * -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -## -## Residual standard error: 4 on 5 degrees of freedom -## Multiple R-squared: 0.803, Adjusted R-squared: 0.724 -## F-statistic: 10.2 on 2 and 5 DF, p-value: 0.0173 -``` - -![The relation between study time and grade including prior experience as an additional component in the model. The blue line shows the slope relating grades to study time, and the black dotted line corresponds to the difference in means between the two groups.](img/file84.png) - -图 14.5 研究时间和年级之间的关系,包括作为模型中额外组成部分的先前经验。蓝线表示与学习时间相关的坡度,黑色虚线表示两组之间平均值的差异。 - -## 14.3 变量之间的相互作用 - -在前面的模型中,我们假设两组的学习时间对成绩的影响(即回归斜率)是相同的。但是,在某些情况下,我们可以想象一个变量的效果可能会因另一个变量的值而不同,我们称之为变量之间的 _ 交互 _。 - -![The relationship between caffeine and public speaking](img/file85.png) - -图 14.6 咖啡因与公共演讲的关系 - -让我们用一个新的例子来问这个问题:咖啡因对公众演讲的影响是什么?首先,让我们生成一些数据并绘制它们。从图[14.6](#fig:CaffeineSpeaking)来看,似乎没有关系,我们可以通过对数据进行线性回归来确认: - -```r -# perform linear regression with caffeine as independent variable -lmResultCaffeine <- lm(speaking ~ caffeine, data = df) -summary(lmResultCaffeine) -``` - -```r -## -## Call: -## lm(formula = speaking ~ caffeine, data = df) -## -## Residuals: -## Min 1Q Median 3Q Max -## -33.10 -16.02 5.01 16.45 26.98 -## -## Coefficients: -## Estimate Std. Error t value Pr(>|t|) -## (Intercept) -7.413 9.165 -0.81 0.43 -## caffeine 0.168 0.151 1.11 0.28 -## -## Residual standard error: 19 on 18 degrees of freedom -## Multiple R-squared: 0.0642, Adjusted R-squared: 0.0122 -## F-statistic: 1.23 on 1 and 18 DF, p-value: 0.281 -``` - -但现在让我们假设,我们发现研究表明焦虑和非焦虑的人对咖啡因的反应不同。首先,让我们分别为焦虑和非焦虑的人绘制数据。 - -![The relationship between caffeine and public speaking, with anxiety represented by the color of the data points](img/file86.png) - -图 14.7 咖啡因与公共演讲的关系,数据点颜色代表焦虑 - -从图[14.7](#fig:CaffeineSpeakingAnxiety)可以看出,两组人的言语和咖啡因之间的关系是不同的,咖啡因改善了无焦虑人群的表现,降低了焦虑人群的表现。我们想创建一个解决这个问题的统计模型。首先,让我们看看如果在模型中包含焦虑会发生什么。 - -```r -# compute linear regression adding anxiety to model -lmResultCafAnx <- lm(speaking ~ caffeine + anxiety, data = df) -summary(lmResultCafAnx) -``` - -```r -## -## Call: -## lm(formula = speaking ~ caffeine + anxiety, data = df) -## -## Residuals: -## Min 1Q Median 3Q Max -## -32.97 -9.74 1.35 10.53 25.36 -## -## Coefficients: -## Estimate Std. Error t value Pr(>|t|) -## (Intercept) -12.581 9.197 -1.37 0.19 -## caffeine 0.131 0.145 0.91 0.38 -## anxietynotAnxious 14.233 8.232 1.73 0.10 -## -## Residual standard error: 18 on 17 degrees of freedom -## Multiple R-squared: 0.204, Adjusted R-squared: 0.11 -## F-statistic: 2.18 on 2 and 17 DF, p-value: 0.144 -``` - -在这里,我们看到咖啡因和焦虑都没有明显的效果,这看起来有点令人困惑。问题是,这一模型试图符合两组人对咖啡因说话的同一条线。如果我们想使用单独的行来拟合它们,我们需要在模型中包含一个 _ 交互 _,这相当于为两个组中的每个组拟合不同的行;在 r 中,这由![](img/28ec51e742166ea3400be6e7343bbfa5.jpg)符号表示。 - -```r -# compute linear regression including caffeine X anxiety interaction -lmResultInteraction <- lm( - speaking ~ caffeine + anxiety + caffeine * anxiety, - data = df -) -summary(lmResultInteraction) -``` - -```r -## -## Call: -## lm(formula = speaking ~ caffeine + anxiety + caffeine * anxiety, -## data = df) -## -## Residuals: -## Min 1Q Median 3Q Max -## -11.385 -7.103 -0.444 6.171 13.458 -## -## Coefficients: -## Estimate Std. Error t value Pr(>|t|) -## (Intercept) 17.4308 5.4301 3.21 0.00546 ** -## caffeine -0.4742 0.0966 -4.91 0.00016 *** -## anxietynotAnxious -43.4487 7.7914 -5.58 4.2e-05 *** -## caffeine:anxietynotAnxious 1.0839 0.1293 8.38 3.0e-07 *** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -## -## Residual standard error: 8.1 on 16 degrees of freedom -## Multiple R-squared: 0.852, Adjusted R-squared: 0.825 -## F-statistic: 30.8 on 3 and 16 DF, p-value: 7.01e-07 -``` - -从这些结果中,我们发现咖啡因和焦虑都有显著的影响(我们称之为 _ 主要影响 _),以及咖啡因和焦虑之间的相互作用。图[14.8](#fig:CaffeineAnxietyInteraction)显示了每组的独立回归线。 - -![The relationship between public speaking and caffeine, including an interaction with anxiety. This results in two lines that separately model the slope for each group.](img/file87.png) - -图 14.8 公众演讲和咖啡因之间的关系,包括与焦虑的互动。这将生成两条线,分别为每个组建模坡度。 - -有时我们想比较两个不同模型的相对拟合,以确定哪个模型更好;我们将其称为 _ 模型比较 _。对于上面的模型,我们可以使用 r 中的`anova()`命令比较模型的拟合优度(有无交互作用): - -```r -anova(lmResultCafAnx, lmResultInteraction) -``` - -```r -## Analysis of Variance Table -## -## Model 1: speaking ~ caffeine + anxiety -## Model 2: speaking ~ caffeine + anxiety + caffeine * anxiety -## Res.Df RSS Df Sum of Sq F Pr(>F) -## 1 17 5639 -## 2 16 1046 1 4593 70.3 3e-07 *** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -``` - -这告诉我们,有很好的证据表明,比起没有交互作用的模型,更倾向于有交互作用的模型。在这种情况下,模型比较相对简单,因为这两个模型是 _ 嵌套的 _——其中一个模型是另一个模型的简化版本。与非嵌套模型的模型比较可能会变得更加复杂。 - -## 14.4“预测”的真正含义是什么? - -当我们谈论日常生活中的“预测”时,我们通常指的是在看到数据之前估计某个变量值的能力。然而,该术语通常在线性回归的背景下用于指模型与数据的拟合;估计值(![](img/e6371f5e5f9dce74d256e6cd501a9bba.jpg))有时被称为“预测”,独立变量被称为“预测”。这有一个不幸的含义,因为它意味着我们的模型还应该能够预测未来新数据点的值。实际上,模型与用于获取参数的数据集的匹配几乎总是优于模型与新数据集的匹配(copas 1983)。 - -作为一个例子,让我们从 NHANES 中选取 48 名儿童为样本,并拟合一个体重回归模型,该模型包括几个回归因子(年龄、身高、看电视和使用电脑的时间以及家庭收入)及其相互作用。 - -```r -# create dataframe with children with complete data on all variables -NHANES_child <- - NHANES %>% - drop_na(Height, Weight, TVHrsDayChild, HHIncomeMid, CompHrsDayChild, Age) %>% - dplyr::filter(Age < 18) -``` - -```r -# create function to sample data and compute regression on in-sample and out-of-sample data - -get_sample_predictions <- function(sample_size, shuffle = FALSE) { - # generate a sample from NHANES - orig_sample <- - NHANES_child %>% - sample_n(sample_size) - - # if shuffle is turned on, then randomly shuffle the weight variable - if (shuffle) { - orig_sample$Weight <- sample(orig_sample$Weight) - } - # compute the regression line for Weight, as a function of several - # other variables (with all possible interactions between variables) - heightRegressOrig <- lm( - Weight ~ Height * TVHrsDayChild * CompHrsDayChild * HHIncomeMid * Age, - data = orig_sample - ) - # compute the predictions - pred_orig <- predict(heightRegressOrig) - - # create a new sample from the same population - new_sample <- - NHANES_child %>% - sample_n(sample_size) - - # use the model fom the original sample to predict the - # Weight values for the new sample - pred_new <- predict(heightRegressOrig, new_sample) - - # return r-squared and rmse for original and new data - return(c( - cor(pred_orig, orig_sample$Weight)**2, - cor(pred_new, new_sample$Weight)**2, - sqrt(mean((pred_orig - orig_sample$Weight)**2)), - sqrt(mean((pred_new - new_sample$Weight)**2)) - )) -} -``` - -```r -# implement the function -sim_results <- - replicate(100, get_sample_predictions(sample_size = 48, shuffle = FALSE)) - -sim_results <- - t(sim_results) %>% - data.frame() - -mean_rsquared <- - sim_results %>% - summarize( - rmse_original_data = mean(X3), - rmse_new_data = mean(X4) - ) - -pander(mean_rsquared) -``` - - -| RMSE_ 原始数据 | RMSE_ 新数据 | -| --- | --- | -| 2.97 条 | 25.72 美元 | - -在这里,我们看到,虽然模型与原始数据相匹配显示出非常好的拟合(每个人只减去几磅),但同一个模型在预测从同一人群中抽样的新儿童的体重值(每个人减去 25 磅以上)方面做得更差。这是因为我们指定的模型非常复杂,因为它不仅包括每个单独的变量,而且还包括它们的所有可能组合(即它们的 _ 交互 _),从而产生一个具有 32 个参数的模型。由于这几乎和数据点一样多的系数(即 48 个孩子的身高),模型 _ 对数据进行了过度拟合 _,就像我们在[5.4 节](#overfitting)中最初的过度拟合示例中的复杂多项式曲线一样。 - -另一种观察过度拟合效果的方法是观察如果我们随机地改变权重变量的值会发生什么。随机改变该值应该使得无法从其他变量预测权重,因为它们不应该有系统的关系。 - -```r -print("using shuffled y variable to simulate null effect") -``` - -```r -## [1] "using shuffled y variable to simulate null effect" -``` - -```r -sim_results <- - replicate(100, get_sample_predictions(sample_size = 48, shuffle = TRUE)) - -sim_results <- - t(sim_results) %>% - data.frame() - -mean_rsquared <- - sim_results %>% - summarize( - rmse_original_data = mean(X3), - rmse_new_data = mean(X4) - ) -pander(mean_rsquared) -``` - - -| rmse_original_data | rmse_new_data | -| --- | --- | -| 7.56 条 | 第 60.1 条 | - -这向我们表明,即使没有真正的关系需要建模(因为疏解应该消除了关系),复杂的模型在预测中仍然显示非常低的错误,因为它适合特定数据集中的噪声。然而,当该模型应用于一个新的数据集时,我们会发现错误要大得多,这是应该的。 - -# - -## 14.4.1 交叉验证 - -为了帮助解决过拟合问题而开发的一种方法是 _ 交叉验证 _。这种技术通常用于机器学习领域,该领域的重点是构建能够很好地概括为新数据的模型,即使我们没有新的数据集来测试模型。交叉验证背后的想法是,我们反复地适应我们的模型,每次都会遗漏数据的一个子集,然后测试模型预测每个被保留的子集中值的能力。 - -![A schematic of the cross-validation procedure.](img/file88.png) - -图 14.9 交叉验证程序示意图。 - -让我们看看这对于我们的重量预测示例是如何工作的。在这种情况下,我们将执行 12 倍交叉验证,这意味着我们将把数据分成 12 个子集,然后将模型拟合 12 次,在每种情况下,去掉其中一个子集,然后测试模型准确预测所持有的因变量值的能力。-找出数据点。R 中的`caret`包使我们能够轻松地跨数据集运行交叉验证: - -```r -# create a function to run cross-validation -# returns the r-squared for the out-of-sample prediction - -compute_cv <- function(d, nfolds = 12) { - # based on https://quantdev.ssri.psu.edu/tutorials/cross-validation-tutorial - train_ctrl <- trainControl(method = "cv", number = nfolds) - model_caret <- train( - Weight ~ Height * TVHrsDayChild * CompHrsDayChild * HHIncomeMid * Age, - data = d, - trControl = train_ctrl, # folds - method = "lm" - ) # specifying regression model - - r2_cv <- mean(model_caret$resample$Rsquared) - rmse_cv <- mean(model_caret$resample$RMSE) - return(c(r2_cv, rmse_cv)) -} -``` - -使用此函数,我们可以对来自 nhanes 数据集的 100 个样本运行交叉验证,并计算交叉验证的 RMSE,以及原始数据和新数据集的 RMSE,正如我们上面计算的那样。 - -```r -#implement the function -sim_results <- - replicate(100, get_sample_predictions_cv(sample_size = 48, shuffle = FALSE)) - -sim_results <- - t(sim_results) %>% - data.frame() - -mean_rsquared <- - sim_results %>% - summarize( - mse_original_data = mean(X4), - mse_new_data = mean(X5), - mse_crossvalidation = mean(X6) - ) -pander(mean_rsquared) -``` - - -| MSE 原始数据 | MSE 新数据 | MSE 交叉验证 | -| --- | --- | --- | -| 2.98 年 | 21.64 条 | 29.29 条 | - -在这里,我们看到交叉验证给了我们一个预测准确性的估计,它比我们用原始数据集看到的膨胀的准确性更接近我们用一个全新数据集看到的结果——事实上,它甚至比新数据集的平均值更悲观。可能是因为只有部分数据被用来训练每个模型。我们还可以确认,当因变量随机变动时,交叉验证能准确估计预测精度: - - -| rmse_original_data | rmse_new_data | RMSE 交叉验证 | -| --- | --- | --- | -| 第 7.9 条 | 第 73.7 条 | 75.31 条 | - -在这里,我们再次看到交叉验证给了我们一个预测准确性的评估,这与我们对新数据的预期更为接近,而且更为悲观。 - -正确使用交叉验证是很困难的,建议在实际使用之前咨询专家。然而,本节希望向您展示三件事: - -* “预言”并不总是意味着你认为它意味着什么。 -* 复杂的模型会严重地过度拟合数据,这样即使没有真正的预测信号,人们也能看到似乎很好的预测。 -* 除非使用适当的方法,否则您应该非常怀疑地查看有关预测准确性的声明。 - -## 14.5 阅读建议 - -* [统计学习要素:数据挖掘、推理和预测(第二版)](https://web.stanford.edu/~hastie/Papers/ESLII.pdf)——机器学习方法圣经,在线免费提供。 \ No newline at end of file diff --git a/docs/15.md b/docs/15.md index da6fd8bfb5e9b99c0b27330fd3402a0a7ad71ad3..bc1babb04d423224fc27f0c42a405e4c9b2a90e5 100644 --- a/docs/15.md +++ b/docs/15.md @@ -24,4 +24,359 @@ NHANES_sample <- ![Violin plot showing distributions of TV watching separated by regular marijuana use.](img/file89.png) -图 15.1 显示电视观看分布的小提琴图,由正常的大麻使用分开。 \ No newline at end of file +图 15.1 显示电视观看分布的小提琴图,由正常的大麻使用分开。 + +## 15.1 学生 T 考试 + +在上一章的假设检验中,我们已经遇到了学生 t 统计量。这一统计数据为我们提供了一种测试两组独立观测值之间差异的方法;我们将在本章后面的部分讨论观测值不独立的情况。作为提醒,两个独立组比较的 t 统计量计算如下: + +![](img/eb22be2bb5310a1a8380ab51dc3403b2.jpg) + +其中![](img/9f07a04e73180057e99b6fb08e88614c.jpg)和![](img/2e54e3c201411d186d4ed11b14e4d6b6.jpg)是两组的平均值,![](img/faae753102a8b7f33f0d7c3b55d0f7fe.jpg)和![](img/81f40c14dd3a65790975635990f05d79.jpg)是每组的方差,![](img/43dc0e5b26df34d3e2f9c1ea065d2cec.jpg)和![](img/f654c11a6cebbc4eb0d47572ce0dd9ed.jpg)是两组的大小。在均值无差的零假设下,该统计量按自由度为 n-2 的 t 分布进行分布(因为我们计算了两个参数估计,即两组的均值)。我们可以使用`t.test()`函数计算 r 中的 t 检验。在本例中,我们从吸烟大麻与更大的电视收看量相关的具体假设开始,因此我们将使用单尾测试。由于 t.test 函数按字母顺序排列条件,“no”组排在第一位,因此我们需要测试第一组是否小于第二组(“yes”)的替代假设;因此,我们指定“less”作为替代。 + +```r +# compute t test for tv watching as function of marijuana use +t.test( + TVHrsNum ~ RegularMarij, + data = NHANES_sample, + var.equal = TRUE, + alternative = 'less' +) +``` + +```r +## +## Two Sample t-test +## +## data: TVHrsNum by RegularMarij +## t = -3, df = 200, p-value = 0.001 +## alternative hypothesis: true difference in means is less than 0 +## 95 percent confidence interval: +## -Inf -0.29 +## sample estimates: +## mean in group No mean in group Yes +## 2.2 2.8 +``` + +在这种情况下,我们发现,在预期的方向上,两组之间有统计学上的显著差异——普通的大麻吸烟者看更多的电视。 + +## 15.2 t 检验作为线性模型 + +t 检验是比较平均值的一种专用工具,但也可以看作是一般线性模型的一种应用。在这种情况下,模型如下所示: + +![](img/257b344874c7e71d01555b79baca9bb3.jpg) + +然而,吸烟是一个二元变量,因此我们将其作为一个 _ 虚拟变量 _,正如我们在上一章中讨论的那样,将其设置为吸烟者为 1,不吸烟者为零。在这种情况下,![](img/1bd70013553271dc3b9b449a5eb5a8a9.jpg)只是两组之间平均值的差,![](img/c1901c25b94eab74ccb483851ca51d1c.jpg)是编码为零的组的平均值。我们可以使用`lm()`函数来拟合这个模型,并看到它给出与上面的 t 检验相同的 t 统计量: + +```r +# print summary of linear regression to perform t-test +s <- summary(lm(TVHrsNum ~ RegularMarij, data = NHANES_sample)) +s +``` + +```r +## +## Call: +## lm(formula = TVHrsNum ~ RegularMarij, data = NHANES_sample) +## +## Residuals: +## Min 1Q Median 3Q Max +## -2.810 -1.165 -0.166 0.835 2.834 +## +## Coefficients: +## Estimate Std. Error t value Pr(>|t|) +## (Intercept) 2.165 0.115 18.86 <2e-16 *** +## RegularMarijYes 0.645 0.213 3.02 0.0028 ** +## --- +## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 +## +## Residual standard error: 1.4 on 198 degrees of freedom +## Multiple R-squared: 0.0441, Adjusted R-squared: 0.0393 +## F-statistic: 9.14 on 1 and 198 DF, p-value: 0.00282 +``` + +我们还可以以图形方式查看 lm()结果(参见图[15.2](#fig:ttestFig)): + +![Violin plots showing data for each group, with a blue line connecting the predicted values for each group, computed on the basis of the results of the linear model.](img/file90.png) + +图 15.2 显示每组数据的小提琴图,蓝色线连接每组的预测值,根据线性模型的结果计算。 + +在这种情况下,不吸烟者的预测值为![](img/c1901c25b94eab74ccb483851ca51d1c.jpg)(2.17),吸烟者的预测值为![](img/522c5e6348887a4c95fababbfeddf52c.jpg)(2.81)。 + +为了计算这个分析的标准误差,我们可以使用与线性回归完全相同的方程——因为这实际上只是线性回归的另一个例子。事实上,如果将上述 t 检验中的 p 值与大麻使用变量的线性回归分析中的 p 值进行比较,您会发现线性回归分析中的 p 值正好是 t 检验中的 p 值的两倍,因为线性回归分析正在执行双尾测试。 + +# + +## 15.2.1 比较两种方法的效果大小 + +两种方法之间比较最常用的效果大小是 Cohen's D(如您在第[10](#ci-effect-size-power)章中所记得的),它是用标准误差单位表示效果的表达式。对于使用上文概述的一般线性模型(即使用单个虚拟编码变量)估计的 t 检验,其表示为: + +![](img/eff581a67a6fe31d7bced24afcaffab4.jpg) + +我们可以从上面的分析输出中获得这些值,得出 d=0.47,我们通常将其解释为中等大小的效果。 + +我们也可以计算这个分析的![](img/37b3c24ff77b4f85a3ac7fc7c3c88062.jpg),它告诉我们看电视的差异有多大。这个值(在 lm()分析的摘要中报告)是 0.04,这告诉我们,虽然效果在统计上有显著意义,但它在电视观看方面的差异相对较小。 + +## 15.3 平均差的贝叶斯因子 + +正如我们在贝叶斯分析一章中所讨论的,贝叶斯因子提供了一种更好地量化证据的方法,支持或反对零差异假设。在这种情况下,我们要针对零假设进行测试,即差异小于零,因为差异是由第一组(“否”)和第二组(“是”)之间的函数计算得出的。因此,我们指定了一个从零到无穷大的“空间隔”,这意味着替代值小于零。 + +```r +# compute bayes factor for group comparison +bf <- ttestBF( + formula = TVHrsNum ~ RegularMarij, + data = NHANES_sample, + nullInterval = c(0, Inf) +) +bf +``` + +```r +## Bayes factor analysis +## -------------- +## [1] Alt., r=0.707 0|t|) +## (Intercept) 121.770 1.336 207.545 91.2 <2e-16 *** +## timepointBPSys2 -0.930 0.387 199.000 -2.4 0.017 * +## --- +## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 +## +## Correlation of Fixed Effects: +## (Intr) +## tmpntBPSys2 -0.145 +``` + +您可以看到,这向我们显示了一个 p 值,它非常接近于使用`t.test()`函数计算的成对 t 检验的结果。 + +## 15.5 比较两种以上的方法 + +通常我们想比较两种以上的方法来确定它们之间是否存在差异。假设我们正在分析一项治疗高血压的临床试验的数据。在研究中,志愿者被随机分为三种情况:药物 1、药物 2 或安慰剂。让我们生成一些数据并绘制它们(参见图[15.6](#fig:DrugTrial)) + +![Box plots showing blood pressure for three different groups in our clinical trial.](img/file94.png) + +图 15.6 显示我们临床试验中三个不同组的血压的方框图。 + +# + +## 15.5.1 方差分析 + +我们首先要验证一个无效的假设,即所有组的平均值都是相等的——也就是说,两种治疗都没有任何效果。我们可以使用一个名为 _ 方差分析 _(anova)的方法来实现这一点。这是心理统计学中最常用的方法之一,我们将只触及表面。方差分析背后的基本思想是我们在关于一般线性模型的章节中已经讨论过的,事实上,方差分析只是这种模型具体实现的一个名称。 + +记住,从上一章我们可以将数据中的总方差(![](img/faf0cc0e13c7f76010a24da69ea6a995.jpg))划分为模型(![](img/1b171d25e28c908c537ba164ef44508f.jpg))解释的方差和非模型(![](img/cada9ea63611321a50f83f4ff82d1a6f.jpg))解释的方差。然后我们可以通过除以它们的自由度来计算每一个的 _ 均方 _;对于误差,这是![](img/4c73819c1d511acb2a2b59fbc4478801.jpg)(其中![](img/648811253cdbfe19389964c25be56518.jpg)是我们计算的平均数),对于模型,这是![](img/38354c005ec5000e4f493fa45ffc9664.jpg): + +![](img/d7ca248dffd28b51d7519cfe6cb9aa6e.jpg) + +![](img/989fabebe06e36a6b69e982f409ae3af.jpg) + +通过方差分析,我们想要检验在平均值之间没有差异的无效假设下,模型所解释的方差是否大于我们所期望的偶然值。而对于 t 分布,零假设下的期望值是零,这里不是这样,因为平方和总是正数。幸运的是,还有另一个标准分布描述了在零假设下平方和的比率是如何分布的:f 分布(见图[15.7](#fig:FDist))。这个分布有两个自由度,分别对应分子的自由度(在本例中是模型)和分母(在本例中是误差)。 + +![F distributions under the null hypothesis, for different values of degrees of freedom.](img/file95.png) + +图 15.7 零假设下,自由度不同值的 F 分布。 + +为了创建一个方差分析模型,我们扩展了您在上一章中遇到的 _ 伪编码 _ 的思想。记住,对于比较两个平均值的 t 检验,我们创建了一个虚拟变量,其中一个条件的值为 1,另一个条件的值为零。在这里,我们通过创建两个虚拟变量来扩展这一想法,一个是为药物 1 状态编码,另一个是为药物 2 状态编码。正如在 t 检验中一样,我们将有一个条件(在本例中是安慰剂)没有一个虚拟变量,因此代表了与其他变量进行比较的基线;其平均值定义了模型的截距。让我们创建药物 1 和 2 的虚拟编码。 + +```r +# create dummy variables for drug1 and drug2 +df <- + df %>% + mutate( + d1 = as.integer(group == "drug1"), # 1s for drug1, 0s for all other drugs + d2 = as.integer(group == "drug2") # 1s for drug2, 0s for all other drugs + ) +``` + +现在,我们可以使用上一章中使用的相同方法来拟合模型: + +```r +# fit ANOVA model +lmResultANOVA <- lm(sysBP ~ d1 + d2, data = df) +summary(lmResultANOVA) +``` + +```r +## +## Call: +## lm(formula = sysBP ~ d1 + d2, data = df) +## +## Residuals: +## Min 1Q Median 3Q Max +## -29.084 -7.745 -0.098 7.687 23.431 +## +## Coefficients: +## Estimate Std. Error t value Pr(>|t|) +## (Intercept) 141.60 1.66 85.50 < 2e-16 *** +## d1 -10.24 2.34 -4.37 2.9e-05 *** +## d2 -2.03 2.34 -0.87 0.39 +## --- +## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 +## +## Residual standard error: 9.9 on 105 degrees of freedom +## Multiple R-squared: 0.169, Adjusted R-squared: 0.154 +## F-statistic: 10.7 on 2 and 105 DF, p-value: 5.83e-05 +``` + +这个命令的输出为我们提供了两件事。首先,它向我们展示了每一个虚拟变量的 t 检验结果,这基本上告诉我们每一个条件是否与安慰剂不同;药物 1 似乎不同,而药物 2 则不同。但是,请记住,如果我们想要解释这些测试,我们需要更正 p 值,以说明我们已经进行了多个假设测试;我们将在下一章中看到如何进行此操作的示例。 + +记住,我们开始想要测试的假设是,任何条件之间是否存在任何差异;我们将其称为 _ 综合假设测试,这是由 F 统计量提供的测试。F 统计量基本上告诉我们,我们的模型是否比只包含截距的简单模型更好。在这种情况下,我们看到 f 检验是非常显著的,这与我们的印象一致,即两组之间确实存在差异(事实上,我们知道存在差异,因为我们创建了数据)。_ \ No newline at end of file diff --git a/docs/15.x2.md b/docs/15.x2.md deleted file mode 100644 index bc1babb04d423224fc27f0c42a405e4c9b2a90e5..0000000000000000000000000000000000000000 --- a/docs/15.x2.md +++ /dev/null @@ -1,382 +0,0 @@ -# 15 比较方法 - -在统计学中,我们要问的最常见的问题之一是两个不同组的平均值是否存在差异。假设我们想知道经常吸食大麻的人是否会看更多的电视。我们可以使用 nhanes 数据集来问这个问题;让我们从数据集中抽取 200 个人的样本,测试每天看电视的时间是否与正常使用大麻有关。图[15.1](#fig:PotTVViolin)显示了使用小提琴绘图的这些数据。 - -```r -# create sample with tv watching and marijuana use -NHANES_sample <- - NHANES_adult %>% - drop_na(TVHrsDay, RegularMarij) %>% - mutate( - TVHrsNum = recode( #recode character values into numerical values - TVHrsDay, - "More_4_hr" = 5, - "4_hr" = 4, - "2_hr" = 2, - "1_hr" = 1, - "3_hr" = 3, - "0_to_1_hr" = 0.5, - "0_hrs" = 0 - ) - ) %>% - sample_n(200) -``` - -![Violin plot showing distributions of TV watching separated by regular marijuana use.](img/file89.png) - -图 15.1 显示电视观看分布的小提琴图,由正常的大麻使用分开。 - -## 15.1 学生 T 考试 - -在上一章的假设检验中,我们已经遇到了学生 t 统计量。这一统计数据为我们提供了一种测试两组独立观测值之间差异的方法;我们将在本章后面的部分讨论观测值不独立的情况。作为提醒,两个独立组比较的 t 统计量计算如下: - -![](img/eb22be2bb5310a1a8380ab51dc3403b2.jpg) - -其中![](img/9f07a04e73180057e99b6fb08e88614c.jpg)和![](img/2e54e3c201411d186d4ed11b14e4d6b6.jpg)是两组的平均值,![](img/faae753102a8b7f33f0d7c3b55d0f7fe.jpg)和![](img/81f40c14dd3a65790975635990f05d79.jpg)是每组的方差,![](img/43dc0e5b26df34d3e2f9c1ea065d2cec.jpg)和![](img/f654c11a6cebbc4eb0d47572ce0dd9ed.jpg)是两组的大小。在均值无差的零假设下,该统计量按自由度为 n-2 的 t 分布进行分布(因为我们计算了两个参数估计,即两组的均值)。我们可以使用`t.test()`函数计算 r 中的 t 检验。在本例中,我们从吸烟大麻与更大的电视收看量相关的具体假设开始,因此我们将使用单尾测试。由于 t.test 函数按字母顺序排列条件,“no”组排在第一位,因此我们需要测试第一组是否小于第二组(“yes”)的替代假设;因此,我们指定“less”作为替代。 - -```r -# compute t test for tv watching as function of marijuana use -t.test( - TVHrsNum ~ RegularMarij, - data = NHANES_sample, - var.equal = TRUE, - alternative = 'less' -) -``` - -```r -## -## Two Sample t-test -## -## data: TVHrsNum by RegularMarij -## t = -3, df = 200, p-value = 0.001 -## alternative hypothesis: true difference in means is less than 0 -## 95 percent confidence interval: -## -Inf -0.29 -## sample estimates: -## mean in group No mean in group Yes -## 2.2 2.8 -``` - -在这种情况下,我们发现,在预期的方向上,两组之间有统计学上的显著差异——普通的大麻吸烟者看更多的电视。 - -## 15.2 t 检验作为线性模型 - -t 检验是比较平均值的一种专用工具,但也可以看作是一般线性模型的一种应用。在这种情况下,模型如下所示: - -![](img/257b344874c7e71d01555b79baca9bb3.jpg) - -然而,吸烟是一个二元变量,因此我们将其作为一个 _ 虚拟变量 _,正如我们在上一章中讨论的那样,将其设置为吸烟者为 1,不吸烟者为零。在这种情况下,![](img/1bd70013553271dc3b9b449a5eb5a8a9.jpg)只是两组之间平均值的差,![](img/c1901c25b94eab74ccb483851ca51d1c.jpg)是编码为零的组的平均值。我们可以使用`lm()`函数来拟合这个模型,并看到它给出与上面的 t 检验相同的 t 统计量: - -```r -# print summary of linear regression to perform t-test -s <- summary(lm(TVHrsNum ~ RegularMarij, data = NHANES_sample)) -s -``` - -```r -## -## Call: -## lm(formula = TVHrsNum ~ RegularMarij, data = NHANES_sample) -## -## Residuals: -## Min 1Q Median 3Q Max -## -2.810 -1.165 -0.166 0.835 2.834 -## -## Coefficients: -## Estimate Std. Error t value Pr(>|t|) -## (Intercept) 2.165 0.115 18.86 <2e-16 *** -## RegularMarijYes 0.645 0.213 3.02 0.0028 ** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -## -## Residual standard error: 1.4 on 198 degrees of freedom -## Multiple R-squared: 0.0441, Adjusted R-squared: 0.0393 -## F-statistic: 9.14 on 1 and 198 DF, p-value: 0.00282 -``` - -我们还可以以图形方式查看 lm()结果(参见图[15.2](#fig:ttestFig)): - -![Violin plots showing data for each group, with a blue line connecting the predicted values for each group, computed on the basis of the results of the linear model.](img/file90.png) - -图 15.2 显示每组数据的小提琴图,蓝色线连接每组的预测值,根据线性模型的结果计算。 - -在这种情况下,不吸烟者的预测值为![](img/c1901c25b94eab74ccb483851ca51d1c.jpg)(2.17),吸烟者的预测值为![](img/522c5e6348887a4c95fababbfeddf52c.jpg)(2.81)。 - -为了计算这个分析的标准误差,我们可以使用与线性回归完全相同的方程——因为这实际上只是线性回归的另一个例子。事实上,如果将上述 t 检验中的 p 值与大麻使用变量的线性回归分析中的 p 值进行比较,您会发现线性回归分析中的 p 值正好是 t 检验中的 p 值的两倍,因为线性回归分析正在执行双尾测试。 - -# - -## 15.2.1 比较两种方法的效果大小 - -两种方法之间比较最常用的效果大小是 Cohen's D(如您在第[10](#ci-effect-size-power)章中所记得的),它是用标准误差单位表示效果的表达式。对于使用上文概述的一般线性模型(即使用单个虚拟编码变量)估计的 t 检验,其表示为: - -![](img/eff581a67a6fe31d7bced24afcaffab4.jpg) - -我们可以从上面的分析输出中获得这些值,得出 d=0.47,我们通常将其解释为中等大小的效果。 - -我们也可以计算这个分析的![](img/37b3c24ff77b4f85a3ac7fc7c3c88062.jpg),它告诉我们看电视的差异有多大。这个值(在 lm()分析的摘要中报告)是 0.04,这告诉我们,虽然效果在统计上有显著意义,但它在电视观看方面的差异相对较小。 - -## 15.3 平均差的贝叶斯因子 - -正如我们在贝叶斯分析一章中所讨论的,贝叶斯因子提供了一种更好地量化证据的方法,支持或反对零差异假设。在这种情况下,我们要针对零假设进行测试,即差异小于零,因为差异是由第一组(“否”)和第二组(“是”)之间的函数计算得出的。因此,我们指定了一个从零到无穷大的“空间隔”,这意味着替代值小于零。 - -```r -# compute bayes factor for group comparison -bf <- ttestBF( - formula = TVHrsNum ~ RegularMarij, - data = NHANES_sample, - nullInterval = c(0, Inf) -) -bf -``` - -```r -## Bayes factor analysis -## -------------- -## [1] Alt., r=0.707 0|t|) -## (Intercept) 121.770 1.336 207.545 91.2 <2e-16 *** -## timepointBPSys2 -0.930 0.387 199.000 -2.4 0.017 * -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -## -## Correlation of Fixed Effects: -## (Intr) -## tmpntBPSys2 -0.145 -``` - -您可以看到,这向我们显示了一个 p 值,它非常接近于使用`t.test()`函数计算的成对 t 检验的结果。 - -## 15.5 比较两种以上的方法 - -通常我们想比较两种以上的方法来确定它们之间是否存在差异。假设我们正在分析一项治疗高血压的临床试验的数据。在研究中,志愿者被随机分为三种情况:药物 1、药物 2 或安慰剂。让我们生成一些数据并绘制它们(参见图[15.6](#fig:DrugTrial)) - -![Box plots showing blood pressure for three different groups in our clinical trial.](img/file94.png) - -图 15.6 显示我们临床试验中三个不同组的血压的方框图。 - -# - -## 15.5.1 方差分析 - -我们首先要验证一个无效的假设,即所有组的平均值都是相等的——也就是说,两种治疗都没有任何效果。我们可以使用一个名为 _ 方差分析 _(anova)的方法来实现这一点。这是心理统计学中最常用的方法之一,我们将只触及表面。方差分析背后的基本思想是我们在关于一般线性模型的章节中已经讨论过的,事实上,方差分析只是这种模型具体实现的一个名称。 - -记住,从上一章我们可以将数据中的总方差(![](img/faf0cc0e13c7f76010a24da69ea6a995.jpg))划分为模型(![](img/1b171d25e28c908c537ba164ef44508f.jpg))解释的方差和非模型(![](img/cada9ea63611321a50f83f4ff82d1a6f.jpg))解释的方差。然后我们可以通过除以它们的自由度来计算每一个的 _ 均方 _;对于误差,这是![](img/4c73819c1d511acb2a2b59fbc4478801.jpg)(其中![](img/648811253cdbfe19389964c25be56518.jpg)是我们计算的平均数),对于模型,这是![](img/38354c005ec5000e4f493fa45ffc9664.jpg): - -![](img/d7ca248dffd28b51d7519cfe6cb9aa6e.jpg) - -![](img/989fabebe06e36a6b69e982f409ae3af.jpg) - -通过方差分析,我们想要检验在平均值之间没有差异的无效假设下,模型所解释的方差是否大于我们所期望的偶然值。而对于 t 分布,零假设下的期望值是零,这里不是这样,因为平方和总是正数。幸运的是,还有另一个标准分布描述了在零假设下平方和的比率是如何分布的:f 分布(见图[15.7](#fig:FDist))。这个分布有两个自由度,分别对应分子的自由度(在本例中是模型)和分母(在本例中是误差)。 - -![F distributions under the null hypothesis, for different values of degrees of freedom.](img/file95.png) - -图 15.7 零假设下,自由度不同值的 F 分布。 - -为了创建一个方差分析模型,我们扩展了您在上一章中遇到的 _ 伪编码 _ 的思想。记住,对于比较两个平均值的 t 检验,我们创建了一个虚拟变量,其中一个条件的值为 1,另一个条件的值为零。在这里,我们通过创建两个虚拟变量来扩展这一想法,一个是为药物 1 状态编码,另一个是为药物 2 状态编码。正如在 t 检验中一样,我们将有一个条件(在本例中是安慰剂)没有一个虚拟变量,因此代表了与其他变量进行比较的基线;其平均值定义了模型的截距。让我们创建药物 1 和 2 的虚拟编码。 - -```r -# create dummy variables for drug1 and drug2 -df <- - df %>% - mutate( - d1 = as.integer(group == "drug1"), # 1s for drug1, 0s for all other drugs - d2 = as.integer(group == "drug2") # 1s for drug2, 0s for all other drugs - ) -``` - -现在,我们可以使用上一章中使用的相同方法来拟合模型: - -```r -# fit ANOVA model -lmResultANOVA <- lm(sysBP ~ d1 + d2, data = df) -summary(lmResultANOVA) -``` - -```r -## -## Call: -## lm(formula = sysBP ~ d1 + d2, data = df) -## -## Residuals: -## Min 1Q Median 3Q Max -## -29.084 -7.745 -0.098 7.687 23.431 -## -## Coefficients: -## Estimate Std. Error t value Pr(>|t|) -## (Intercept) 141.60 1.66 85.50 < 2e-16 *** -## d1 -10.24 2.34 -4.37 2.9e-05 *** -## d2 -2.03 2.34 -0.87 0.39 -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -## -## Residual standard error: 9.9 on 105 degrees of freedom -## Multiple R-squared: 0.169, Adjusted R-squared: 0.154 -## F-statistic: 10.7 on 2 and 105 DF, p-value: 5.83e-05 -``` - -这个命令的输出为我们提供了两件事。首先,它向我们展示了每一个虚拟变量的 t 检验结果,这基本上告诉我们每一个条件是否与安慰剂不同;药物 1 似乎不同,而药物 2 则不同。但是,请记住,如果我们想要解释这些测试,我们需要更正 p 值,以说明我们已经进行了多个假设测试;我们将在下一章中看到如何进行此操作的示例。 - -记住,我们开始想要测试的假设是,任何条件之间是否存在任何差异;我们将其称为 _ 综合假设测试,这是由 F 统计量提供的测试。F 统计量基本上告诉我们,我们的模型是否比只包含截距的简单模型更好。在这种情况下,我们看到 f 检验是非常显著的,这与我们的印象一致,即两组之间确实存在差异(事实上,我们知道存在差异,因为我们创建了数据)。_ \ No newline at end of file diff --git a/docs/16.md b/docs/16.md index c1ce6fef6e3d0d1143c46347bd3725fa7a525966..bf0c359c8f264e61fa89d5c50e84dd5583dc38e4 100644 --- a/docs/16.md +++ b/docs/16.md @@ -1,3 +1,336 @@ # 16 统计建模过程:一个实例 -在这一章中,我们将汇集我们所学的一切,将我们的知识应用到一个实际的例子中。 \ No newline at end of file +在这一章中,我们将汇集我们所学的一切,将我们的知识应用到一个实际的例子中。 + +## 16.1 统计建模过程 + +当我们想要使用我们的统计模型来检验一个科学假设时,我们通常要经历一系列的步骤: + +1. 指定您感兴趣的问题 +2. 识别或收集适当的数据 +3. 准备数据进行分析 +4. 确定合适的模型 +5. 使模型适合数据 +6. 批评模型以确保它适合 +7. 检验假设和量化效应大小 + +让我们来看一个真正的例子。2007 年,斯坦福大学的克里斯托弗·加德纳和他的同事在美国医学协会(HTG1)的杂志上发表了一项研究,题为“比较阿特金斯、Zone、Ornish 和学习饮食对超重绝经前妇女体重变化和相关危险因素的影响,A-toZ 减肥研究:一项随机试验”(Gardner 等人 2007 年)。 + +# + +## 16.1.1 1:指定您感兴趣的问题 + +据作者介绍,他们的研究目标是: + +> 比较 4 种代表低到高碳水化合物摄入谱的减肥饮食对减肥和相关代谢变量的影响。 + +# + +## 16.1.2 2:识别或收集适当的数据 + +为了回答他们的问题,研究人员随机将 311 名超重/肥胖女性中的每一位分为四种不同的饮食(阿特金斯、Zone、Ornish 或 Learn),并随着时间的推移跟踪她们的体重和其他健康指标。 + +作者记录了大量的变量,但对于主要的问题,让我们关注一个变量:体重指数(bmi)。此外,由于我们的目标是测量体重指数的持续变化,我们将只观察饮食开始后 12 个月的测量结果。 + +# + +## 16.1.3 3:准备分析数据 + +A 到 Z 研究的实际数据并不公开,因此我们将使用他们论文中报告的摘要数据生成一些与他们研究中获得的数据大致匹配的合成数据。 + +```r +# generate a dataset based on the results of Gardner et al. Table 3 + +set.seed(123456) +dietDf <- + data.frame(diet=c(rep('Atkins',77), + rep('Zone',79), + rep('LEARN',79), + rep('Ornish',76))) %>% + mutate( + BMIChange12Months=ifelse(diet=='Atkins', + rnorm(n=77,mean=-1.65,sd=2.54), + ifelse(diet=='Zone', + rnorm(n=79,mean=-0.53,sd=2.0), + ifelse(diet=='LEARN', + rnorm(n=79,mean=-0.92,sd=2.0), + rnorm(n=76,mean=-0.77,sd=2.14)))), + physicalActivity=ifelse(diet=='Atkins', + rnorm(n=77,mean=34,sd=6), + ifelse(diet=='Zone', + rnorm(n=79,mean=34,sd=6.0), + ifelse(diet=='LEARN', + rnorm(n=79,mean=34,sd=5.0), + rnorm(n=76,mean=35,sd=7) ))) + ) + +summaryDf <- + dietDf %>% + group_by(diet) %>% + summarize( + n=n(), + meanBMIChange12Months=mean(BMIChange12Months), + varBMIChange12Months=var(BMIChange12Months) + ) %>% + mutate( + crit_val_lower = qt(.05, n - 1), + crit_val_upper = qt(.95, n - 1), + ci.lower=meanBMIChange12Months+(sqrt(varBMIChange12Months)*crit_val_lower)/sqrt(n), + ci.upper=meanBMIChange12Months+(sqrt(varBMIChange12Months)*crit_val_upper)/sqrt(n) + ) + +summaryDf %>% + dplyr::select(-crit_val_lower,-crit_val_upper) %>% + pander() +``` + + +| 饮食 | N 号 | 平均质量变化 12 个月 | varbmichange12 个月 | CI.下 | CI.上部 | +| --- | --- | --- | --- | --- | --- | +| 阿特金斯 | 77 | -1.62 条 | 6.52 条 | -第 2.11 条 | -1.14 条 | +| 学习 | 79 | -0.85 分 | 3.77 条 | -1.21 条 | -0.49 分 | +| 尼什 | 76 | -0.69 分 | 5.36 条 | -1.13 条 | -0.25 分 | +| 区域 | 79 | -0.57 分 | 3.76 条 | -0.93 分 | -0.21 分 | + +![Violin plots for each condition, with the 50th percentile (i.e the median) shown as a black line for each group.](img/file96.png) + +图 16.1 每种情况下的小提琴图,第 50 百分位(即中位数)显示为每组的黑线。 + +现在我们有了数据,让我们可视化它们,以确保没有异常值。小提琴图有助于观察分布的形状,如图[16.1](#fig:AtoZBMIChangeDensity)所示。这些数据看起来相当合理——特别是,似乎没有任何严重的异常值。然而,我们可以看到,分布似乎在方差上有点变化,阿特金斯和欧尼斯比其他分布显示出更大的变异性。这意味着任何假设组间方差相等的分析都可能是不适当的。 + +# + +## 16.1.4 4.确定合适的模型 + +为了确定适合我们分析的统计模型,我们需要问几个问题。 + +* 什么样的因变量? +* bmi:连续,大致正态分布 +* 我们在比较什么? +* 四个饮食组的平均体重指数 +* 方差分析是合适的 +* 观察是否独立? +* 随机分配和使用差分应确保独立和相同分布(IID)误差的假设是适当的。 + +# + +## 16.1.5 5.使模型适合数据 + +让我们做一个关于体重指数变化的方差分析来比较这四种饮食。事实证明,我们实际上不需要自己生成伪编码变量;如果我们给`lm()`一个分类变量,它将自动为我们生成它们。 + +```r +# perform ANOVA and print result + +lmResult <- lm(BMIChange12Months ~ diet, data = dietDf) +lmResult +``` + +```r +## +## Call: +## lm(formula = BMIChange12Months ~ diet, data = dietDf) +## +## Coefficients: +## (Intercept) dietLEARN dietOrnish dietZone +## -1.622 0.772 0.932 1.050 +``` + +请注意,lm 会自动生成与四种饮食中的三种相对应的虚拟变量,使 atkins 饮食没有虚拟变量。这意味着拦截模型阿特金斯饮食,其他三个变量模型的差异,这些饮食和阿特金斯饮食。 + +# + +## 16.1.6 6.批评模型以确保它适合 + +![Residuals from model plotted for each group separately.](img/file97.png) + +图 16.2 分别绘制各组模型的残差。 + +我们要做的第一件事就是批评这个模型,以确保它是适当的。我们可以做的一件事是从模型中观察残差。在图[16.2](#fig:residPlot)中,我们将绘制按饮食分组的每个个体的残差。我们已经把这些要点抖了抖,以便能看到所有的要点。不同条件下的残差没有明显差异,这表明我们可以向前推进并解释模型输出。 + +# + +## 16.1.7 7.检验假设和量化效应大小 + +首先,让我们看一下方差分析的结果总结: + +```r +# print summary of ANOVA statistics + +summary(lmResult) +``` + +```r +## +## Call: +## lm(formula = BMIChange12Months ~ diet, data = dietDf) +## +## Residuals: +## Min 1Q Median 3Q Max +## -8.14 -1.37 0.07 1.50 6.33 +## +## Coefficients: +## Estimate Std. Error t value Pr(>|t|) +## (Intercept) -1.622 0.251 -6.47 3.8e-10 *** +## dietLEARN 0.772 0.352 2.19 0.0292 * +## dietOrnish 0.932 0.356 2.62 0.0092 ** +## dietZone 1.050 0.352 2.98 0.0031 ** +## --- +## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 +## +## Residual standard error: 2.2 on 307 degrees of freedom +## Multiple R-squared: 0.0338, Adjusted R-squared: 0.0243 +## F-statistic: 3.58 on 3 and 307 DF, p-value: 0.0143 +``` + +有意义的 F 检验表明,饮食之间有显著的差异,但我们也应该注意,模型实际上并不能解释数据的很大差异;R 平方值仅为 0.03,表明模型只占体重差异的百分之几。t 损失。因此,我们不想曲解这个结果。 + +显著的结果也不能告诉我们哪些饮食与其他饮食不同。我们可以通过使用`emmeans()`(“估计边际平均值”)函数比较不同条件下的平均值来了解更多信息: + +```r +# compute the differences between each of the means +leastsquare <- emmeans(lmResult, + pairwise ~ diet, + adjust="tukey") + +# display the results by grouping using letters + +CLD(leastsquare$emmeans, + alpha=.05, + Letters=letters) +``` + +```r +## diet emmean SE df lower.CL upper.CL .group +## Atkins -1.62 0.251 307 -2.11 -1.13 a +## LEARN -0.85 0.247 307 -1.34 -0.36 ab +## Ornish -0.69 0.252 307 -1.19 -0.19 b +## Zone -0.57 0.247 307 -1.06 -0.08 b +## +## Confidence level used: 0.95 +## P value adjustment: tukey method for comparing a family of 4 estimates +## significance level used: alpha = 0.05 +``` + +最右边一列中的字母显示了哪些组之间存在差异,使用的方法是根据正在执行的比较数量进行调整。这表明 Atkins 和 Learn 饮食没有区别(因为它们共享字母 A),Learn、Ornish 和 Zone 饮食也没有区别(因为它们共享字母 B),但 Atkins 饮食不同于 Ornish 和 Zone 饮食(因为它们不共享字母)。 + +## + +## 16.1.7.1 贝叶斯系数 + +假设我们希望有更好的方法来描述数据提供的证据数量。我们可以这样做的一种方法是计算贝叶斯因子,我们可以通过拟合完整模型(包括饮食)和简化模型(不包括饮食),然后比较它们的拟合度来实现这一点。对于简化模型,我们只包含一个 1,它告诉拟合程序只适合一个截距。 + +```r +brmFullModel <- brm(BMIChange12Months ~ diet, data = dietDf, + save_all_pars = TRUE) + +brmReducedModel <- brm(BMIChange12Months ~ 1, data = dietDf, + save_all_pars = TRUE) +``` + +```r +bayes_factor(brmFullModel,brmReducedModel) +``` + +```r +## Iteration: 1 +## Iteration: 2 +## Iteration: 3 +## Iteration: 4 +## Iteration: 1 +## Iteration: 2 +## Iteration: 3 +## Iteration: 4 +## Iteration: 5 +``` + +```r +## Estimated Bayes factor in favor of bridge1 over bridge2: 99.86593 +``` + +这表明,对于饮食之间的差异,有非常有力的证据(Bayes 因子接近 100)。 + +# + +## 16.1.8 可能的混淆怎么办? + +如果我们更仔细地看加德的论文,我们会发现他们还报告了每组中有多少人被诊断为代谢综合征(htg0),这是一种以高血压、高血糖、腰部脂肪过多为特征的综合征。胆固醇水平异常与心血管疾病风险增加有关。让我们首先将这些数据添加到摘要数据框中: + +```r +summaryDf <- + summaryDf %>% + mutate( + nMetSym=c(22,20,29,27), + nNoMetSym=n-nMetSym, + pMetSym=nMetSym/(nMetSym+nNoMetSym) + ) + +summaryDf %>% + dplyr::select(diet,n,pMetSym) %>% + pander() +``` + + +| diet | n | PMETSYM 公司 | +| --- | --- | --- | +| Atkins | 77 | 0.29 分 | +| LEARN | 79 | 0.25 分 | +| Ornish | 76 | 0.38 分 | +| Zone | 79 | 0.34 分 | + +从数据来看,似乎不同组之间的发病率略有不同,在华丽的饮食和区域性饮食中出现更多代谢综合征病例——这正是结果较差的饮食。假设我们有兴趣测试两组之间的代谢综合征发生率是否有显著差异,因为这可能使我们担心这些差异可能会影响饮食结果。 + +## + +## 16.1.8.1 确定适当的模型 + +* 什么样的因变量? +* 比例 +* 我们在比较什么? +* 四个饮食组与代谢综合征的比例 +* 拟合优度的卡方检验适用于零差假设。 + +让我们使用`chisq.test()`函数计算该统计: + +```r +chisq.test(summaryDf$nMetSym,summaryDf$nNoMetSym) +``` + +```r +## +## Pearson's Chi-squared test +## +## data: summaryDf$nMetSym and summaryDf$nNoMetSym +## X-squared = 10, df = 9, p-value = 0.2 +``` + +这项测试表明,平均值之间没有显著差异。然而,它并没有告诉我们有多确定我们是没有区别的;记住,在 NHST 下,我们总是在假设无效为真的前提下工作,除非数据向我们展示足够的证据,使我们拒绝这个无效假设。 + +如果我们想要量化支持或反对空值的证据呢?我们可以使用贝叶斯因子来实现这一点。 + +```r +bf <- contingencyTableBF(as.matrix(summaryDf[,9:10]), + sampleType = "indepMulti", + fixedMargin = "cols") +bf +``` + +```r +## Bayes factor analysis +## -------------- +## [1] Non-indep. (a=1) : 0.058 ±0% +## +## Against denominator: +## Null, independence, a = 1 +## --- +## Bayes factor type: BFcontingencyTable, independent multinomial +``` + +这表明,假设的概率比假设的概率高 0.058 倍,这意味着假设的概率比假设的概率高 1/0.058~17 倍。这是相当有力的证据,即使不是完全压倒性的证据。 + +## + +## 16.1.8.2 解决模型中的混淆问题 + +我们通常使用随机分配治疗(如 Gardner 等人是的),因为我们认为,平均而言,它将阻止其他变量(我们称之为 _ 混淆 _)对结果的影响。然而,正如我们在本例中看到的,在任何特定的研究中,可能会出现随机发生的混淆。重要的是要确保条件之间的差异不是由于存在代谢综合征的组之间的差异造成的,为此,我们可以在我们的统计模型中包括代谢综合征变量。通过这样做,任何与代谢综合征相关的变异都将从饮食的影响中消除,这样我们就可以更清楚地测量饮食的影响。 + +在这种情况下,我们没有原始数据,因此无法直接测试它。如果我们有原始数据,我们可以在我们的模型中包括代谢综合征变量,看看饮食和体重减轻之间的关系是否仍然有效;如果确实如此,那么我们可以更加确信,这种关系不是由代谢综合征的任何差异所驱动的。 \ No newline at end of file diff --git a/docs/16.x2.md b/docs/16.x2.md deleted file mode 100644 index bf0c359c8f264e61fa89d5c50e84dd5583dc38e4..0000000000000000000000000000000000000000 --- a/docs/16.x2.md +++ /dev/null @@ -1,336 +0,0 @@ -# 16 统计建模过程:一个实例 - -在这一章中,我们将汇集我们所学的一切,将我们的知识应用到一个实际的例子中。 - -## 16.1 统计建模过程 - -当我们想要使用我们的统计模型来检验一个科学假设时,我们通常要经历一系列的步骤: - -1. 指定您感兴趣的问题 -2. 识别或收集适当的数据 -3. 准备数据进行分析 -4. 确定合适的模型 -5. 使模型适合数据 -6. 批评模型以确保它适合 -7. 检验假设和量化效应大小 - -让我们来看一个真正的例子。2007 年,斯坦福大学的克里斯托弗·加德纳和他的同事在美国医学协会(HTG1)的杂志上发表了一项研究,题为“比较阿特金斯、Zone、Ornish 和学习饮食对超重绝经前妇女体重变化和相关危险因素的影响,A-toZ 减肥研究:一项随机试验”(Gardner 等人 2007 年)。 - -# - -## 16.1.1 1:指定您感兴趣的问题 - -据作者介绍,他们的研究目标是: - -> 比较 4 种代表低到高碳水化合物摄入谱的减肥饮食对减肥和相关代谢变量的影响。 - -# - -## 16.1.2 2:识别或收集适当的数据 - -为了回答他们的问题,研究人员随机将 311 名超重/肥胖女性中的每一位分为四种不同的饮食(阿特金斯、Zone、Ornish 或 Learn),并随着时间的推移跟踪她们的体重和其他健康指标。 - -作者记录了大量的变量,但对于主要的问题,让我们关注一个变量:体重指数(bmi)。此外,由于我们的目标是测量体重指数的持续变化,我们将只观察饮食开始后 12 个月的测量结果。 - -# - -## 16.1.3 3:准备分析数据 - -A 到 Z 研究的实际数据并不公开,因此我们将使用他们论文中报告的摘要数据生成一些与他们研究中获得的数据大致匹配的合成数据。 - -```r -# generate a dataset based on the results of Gardner et al. Table 3 - -set.seed(123456) -dietDf <- - data.frame(diet=c(rep('Atkins',77), - rep('Zone',79), - rep('LEARN',79), - rep('Ornish',76))) %>% - mutate( - BMIChange12Months=ifelse(diet=='Atkins', - rnorm(n=77,mean=-1.65,sd=2.54), - ifelse(diet=='Zone', - rnorm(n=79,mean=-0.53,sd=2.0), - ifelse(diet=='LEARN', - rnorm(n=79,mean=-0.92,sd=2.0), - rnorm(n=76,mean=-0.77,sd=2.14)))), - physicalActivity=ifelse(diet=='Atkins', - rnorm(n=77,mean=34,sd=6), - ifelse(diet=='Zone', - rnorm(n=79,mean=34,sd=6.0), - ifelse(diet=='LEARN', - rnorm(n=79,mean=34,sd=5.0), - rnorm(n=76,mean=35,sd=7) ))) - ) - -summaryDf <- - dietDf %>% - group_by(diet) %>% - summarize( - n=n(), - meanBMIChange12Months=mean(BMIChange12Months), - varBMIChange12Months=var(BMIChange12Months) - ) %>% - mutate( - crit_val_lower = qt(.05, n - 1), - crit_val_upper = qt(.95, n - 1), - ci.lower=meanBMIChange12Months+(sqrt(varBMIChange12Months)*crit_val_lower)/sqrt(n), - ci.upper=meanBMIChange12Months+(sqrt(varBMIChange12Months)*crit_val_upper)/sqrt(n) - ) - -summaryDf %>% - dplyr::select(-crit_val_lower,-crit_val_upper) %>% - pander() -``` - - -| 饮食 | N 号 | 平均质量变化 12 个月 | varbmichange12 个月 | CI.下 | CI.上部 | -| --- | --- | --- | --- | --- | --- | -| 阿特金斯 | 77 | -1.62 条 | 6.52 条 | -第 2.11 条 | -1.14 条 | -| 学习 | 79 | -0.85 分 | 3.77 条 | -1.21 条 | -0.49 分 | -| 尼什 | 76 | -0.69 分 | 5.36 条 | -1.13 条 | -0.25 分 | -| 区域 | 79 | -0.57 分 | 3.76 条 | -0.93 分 | -0.21 分 | - -![Violin plots for each condition, with the 50th percentile (i.e the median) shown as a black line for each group.](img/file96.png) - -图 16.1 每种情况下的小提琴图,第 50 百分位(即中位数)显示为每组的黑线。 - -现在我们有了数据,让我们可视化它们,以确保没有异常值。小提琴图有助于观察分布的形状,如图[16.1](#fig:AtoZBMIChangeDensity)所示。这些数据看起来相当合理——特别是,似乎没有任何严重的异常值。然而,我们可以看到,分布似乎在方差上有点变化,阿特金斯和欧尼斯比其他分布显示出更大的变异性。这意味着任何假设组间方差相等的分析都可能是不适当的。 - -# - -## 16.1.4 4.确定合适的模型 - -为了确定适合我们分析的统计模型,我们需要问几个问题。 - -* 什么样的因变量? -* bmi:连续,大致正态分布 -* 我们在比较什么? -* 四个饮食组的平均体重指数 -* 方差分析是合适的 -* 观察是否独立? -* 随机分配和使用差分应确保独立和相同分布(IID)误差的假设是适当的。 - -# - -## 16.1.5 5.使模型适合数据 - -让我们做一个关于体重指数变化的方差分析来比较这四种饮食。事实证明,我们实际上不需要自己生成伪编码变量;如果我们给`lm()`一个分类变量,它将自动为我们生成它们。 - -```r -# perform ANOVA and print result - -lmResult <- lm(BMIChange12Months ~ diet, data = dietDf) -lmResult -``` - -```r -## -## Call: -## lm(formula = BMIChange12Months ~ diet, data = dietDf) -## -## Coefficients: -## (Intercept) dietLEARN dietOrnish dietZone -## -1.622 0.772 0.932 1.050 -``` - -请注意,lm 会自动生成与四种饮食中的三种相对应的虚拟变量,使 atkins 饮食没有虚拟变量。这意味着拦截模型阿特金斯饮食,其他三个变量模型的差异,这些饮食和阿特金斯饮食。 - -# - -## 16.1.6 6.批评模型以确保它适合 - -![Residuals from model plotted for each group separately.](img/file97.png) - -图 16.2 分别绘制各组模型的残差。 - -我们要做的第一件事就是批评这个模型,以确保它是适当的。我们可以做的一件事是从模型中观察残差。在图[16.2](#fig:residPlot)中,我们将绘制按饮食分组的每个个体的残差。我们已经把这些要点抖了抖,以便能看到所有的要点。不同条件下的残差没有明显差异,这表明我们可以向前推进并解释模型输出。 - -# - -## 16.1.7 7.检验假设和量化效应大小 - -首先,让我们看一下方差分析的结果总结: - -```r -# print summary of ANOVA statistics - -summary(lmResult) -``` - -```r -## -## Call: -## lm(formula = BMIChange12Months ~ diet, data = dietDf) -## -## Residuals: -## Min 1Q Median 3Q Max -## -8.14 -1.37 0.07 1.50 6.33 -## -## Coefficients: -## Estimate Std. Error t value Pr(>|t|) -## (Intercept) -1.622 0.251 -6.47 3.8e-10 *** -## dietLEARN 0.772 0.352 2.19 0.0292 * -## dietOrnish 0.932 0.356 2.62 0.0092 ** -## dietZone 1.050 0.352 2.98 0.0031 ** -## --- -## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 -## -## Residual standard error: 2.2 on 307 degrees of freedom -## Multiple R-squared: 0.0338, Adjusted R-squared: 0.0243 -## F-statistic: 3.58 on 3 and 307 DF, p-value: 0.0143 -``` - -有意义的 F 检验表明,饮食之间有显著的差异,但我们也应该注意,模型实际上并不能解释数据的很大差异;R 平方值仅为 0.03,表明模型只占体重差异的百分之几。t 损失。因此,我们不想曲解这个结果。 - -显著的结果也不能告诉我们哪些饮食与其他饮食不同。我们可以通过使用`emmeans()`(“估计边际平均值”)函数比较不同条件下的平均值来了解更多信息: - -```r -# compute the differences between each of the means -leastsquare <- emmeans(lmResult, - pairwise ~ diet, - adjust="tukey") - -# display the results by grouping using letters - -CLD(leastsquare$emmeans, - alpha=.05, - Letters=letters) -``` - -```r -## diet emmean SE df lower.CL upper.CL .group -## Atkins -1.62 0.251 307 -2.11 -1.13 a -## LEARN -0.85 0.247 307 -1.34 -0.36 ab -## Ornish -0.69 0.252 307 -1.19 -0.19 b -## Zone -0.57 0.247 307 -1.06 -0.08 b -## -## Confidence level used: 0.95 -## P value adjustment: tukey method for comparing a family of 4 estimates -## significance level used: alpha = 0.05 -``` - -最右边一列中的字母显示了哪些组之间存在差异,使用的方法是根据正在执行的比较数量进行调整。这表明 Atkins 和 Learn 饮食没有区别(因为它们共享字母 A),Learn、Ornish 和 Zone 饮食也没有区别(因为它们共享字母 B),但 Atkins 饮食不同于 Ornish 和 Zone 饮食(因为它们不共享字母)。 - -## - -## 16.1.7.1 贝叶斯系数 - -假设我们希望有更好的方法来描述数据提供的证据数量。我们可以这样做的一种方法是计算贝叶斯因子,我们可以通过拟合完整模型(包括饮食)和简化模型(不包括饮食),然后比较它们的拟合度来实现这一点。对于简化模型,我们只包含一个 1,它告诉拟合程序只适合一个截距。 - -```r -brmFullModel <- brm(BMIChange12Months ~ diet, data = dietDf, - save_all_pars = TRUE) - -brmReducedModel <- brm(BMIChange12Months ~ 1, data = dietDf, - save_all_pars = TRUE) -``` - -```r -bayes_factor(brmFullModel,brmReducedModel) -``` - -```r -## Iteration: 1 -## Iteration: 2 -## Iteration: 3 -## Iteration: 4 -## Iteration: 1 -## Iteration: 2 -## Iteration: 3 -## Iteration: 4 -## Iteration: 5 -``` - -```r -## Estimated Bayes factor in favor of bridge1 over bridge2: 99.86593 -``` - -这表明,对于饮食之间的差异,有非常有力的证据(Bayes 因子接近 100)。 - -# - -## 16.1.8 可能的混淆怎么办? - -如果我们更仔细地看加德的论文,我们会发现他们还报告了每组中有多少人被诊断为代谢综合征(htg0),这是一种以高血压、高血糖、腰部脂肪过多为特征的综合征。胆固醇水平异常与心血管疾病风险增加有关。让我们首先将这些数据添加到摘要数据框中: - -```r -summaryDf <- - summaryDf %>% - mutate( - nMetSym=c(22,20,29,27), - nNoMetSym=n-nMetSym, - pMetSym=nMetSym/(nMetSym+nNoMetSym) - ) - -summaryDf %>% - dplyr::select(diet,n,pMetSym) %>% - pander() -``` - - -| diet | n | PMETSYM 公司 | -| --- | --- | --- | -| Atkins | 77 | 0.29 分 | -| LEARN | 79 | 0.25 分 | -| Ornish | 76 | 0.38 分 | -| Zone | 79 | 0.34 分 | - -从数据来看,似乎不同组之间的发病率略有不同,在华丽的饮食和区域性饮食中出现更多代谢综合征病例——这正是结果较差的饮食。假设我们有兴趣测试两组之间的代谢综合征发生率是否有显著差异,因为这可能使我们担心这些差异可能会影响饮食结果。 - -## - -## 16.1.8.1 确定适当的模型 - -* 什么样的因变量? -* 比例 -* 我们在比较什么? -* 四个饮食组与代谢综合征的比例 -* 拟合优度的卡方检验适用于零差假设。 - -让我们使用`chisq.test()`函数计算该统计: - -```r -chisq.test(summaryDf$nMetSym,summaryDf$nNoMetSym) -``` - -```r -## -## Pearson's Chi-squared test -## -## data: summaryDf$nMetSym and summaryDf$nNoMetSym -## X-squared = 10, df = 9, p-value = 0.2 -``` - -这项测试表明,平均值之间没有显著差异。然而,它并没有告诉我们有多确定我们是没有区别的;记住,在 NHST 下,我们总是在假设无效为真的前提下工作,除非数据向我们展示足够的证据,使我们拒绝这个无效假设。 - -如果我们想要量化支持或反对空值的证据呢?我们可以使用贝叶斯因子来实现这一点。 - -```r -bf <- contingencyTableBF(as.matrix(summaryDf[,9:10]), - sampleType = "indepMulti", - fixedMargin = "cols") -bf -``` - -```r -## Bayes factor analysis -## -------------- -## [1] Non-indep. (a=1) : 0.058 ±0% -## -## Against denominator: -## Null, independence, a = 1 -## --- -## Bayes factor type: BFcontingencyTable, independent multinomial -``` - -这表明,假设的概率比假设的概率高 0.058 倍,这意味着假设的概率比假设的概率高 1/0.058~17 倍。这是相当有力的证据,即使不是完全压倒性的证据。 - -## - -## 16.1.8.2 解决模型中的混淆问题 - -我们通常使用随机分配治疗(如 Gardner 等人是的),因为我们认为,平均而言,它将阻止其他变量(我们称之为 _ 混淆 _)对结果的影响。然而,正如我们在本例中看到的,在任何特定的研究中,可能会出现随机发生的混淆。重要的是要确保条件之间的差异不是由于存在代谢综合征的组之间的差异造成的,为此,我们可以在我们的统计模型中包括代谢综合征变量。通过这样做,任何与代谢综合征相关的变异都将从饮食的影响中消除,这样我们就可以更清楚地测量饮食的影响。 - -在这种情况下,我们没有原始数据,因此无法直接测试它。如果我们有原始数据,我们可以在我们的模型中包括代谢综合征变量,看看饮食和体重减轻之间的关系是否仍然有效;如果确实如此,那么我们可以更加确信,这种关系不是由代谢综合征的任何差异所驱动的。 \ No newline at end of file diff --git a/docs/17.md b/docs/17.md index 6215e8b0da02154e41a82e149f998c2bef4c7f91..10bf215ebacf6ccea1a5c22d209276f1fcc75ad3 100644 --- a/docs/17.md +++ b/docs/17.md @@ -1,3 +1,176 @@ # 17 做重复性研究 -大多数人认为科学是回答世界问题的可靠方法。当我们的医生开出治疗处方时,我们相信通过研究已经证明它是有效的,我们也有类似的信念,即我们乘坐的飞机不会从天上掉下来。然而,自 2005 年以来,人们越来越担心科学可能不会一直像我们长久以来认为的那样有效。在本章中,我们将讨论这些关于科学研究再现性的问题,并概述可以采取的步骤,以确保我们的统计结果尽可能具有再现性。 \ No newline at end of file +大多数人认为科学是回答世界问题的可靠方法。当我们的医生开出治疗处方时,我们相信通过研究已经证明它是有效的,我们也有类似的信念,即我们乘坐的飞机不会从天上掉下来。然而,自 2005 年以来,人们越来越担心科学可能不会一直像我们长久以来认为的那样有效。在本章中,我们将讨论这些关于科学研究再现性的问题,并概述可以采取的步骤,以确保我们的统计结果尽可能具有再现性。 + +## 17.1 我们认为科学应该如何运作 + +假设我们对一个关于孩子如何选择吃什么的研究项目感兴趣。这是著名的饮食研究者布莱恩·万辛克和他的同事在 2012 年的一项研究中提出的一个问题。标准(正如我们将看到的,有些幼稚)的观点是这样的: + +* 你从一个假设开始 +* 用流行人物做品牌应该能让孩子们更频繁地选择“健康”食品。 +* 你收集了一些数据 +* 让孩子们在饼干和苹果之间做出选择,要么贴上 Elmo 品牌的标签,要么贴上控制标签,并记录下他们的选择。 +* 你做统计来检验无效假设 +* “预先计划的比较显示,Elmo 品牌的苹果与儿童选择苹果的比例从 20.7%增加到 33.8%(htg0=5.158;p=0.02)”(Wansink、Just 和 Payne 2012) +* 你根据这些数据得出结论*“这项研究表明,使用品牌或吸引人的品牌特征可能比使用放纵的、经过高度加工的食品更有益于健康的食品。正如吸引人的名字已经被证明可以增加学校午餐室对健康食品的选择一样,品牌和卡通人物对幼儿也有同样的作用。”(Wansink,Just 和 Payne 2012) + +## 17.2 科学(有时)是如何工作的 + +布莱恩·万辛克以他的《无意识饮食》一书而闻名,他参加公司演讲会的费用是几万美元。2017 年,一组研究人员开始仔细研究他发表的一些研究,从一组关于人们在自助餐厅吃多少比萨饼的论文开始。研究人员要求 Wansink 分享这些研究的数据,但他拒绝了,所以他们仔细研究了他的论文,发现论文中存在大量的不一致和统计问题。围绕这一分析的宣传导致了其他一些人深入研究了 Wansink 的过去,包括在 Wansink 和他的合作者之间获取电子邮件。正如 Stephanie Lee 在 BuzzFeed 上报道的那样,这些电子邮件显示了 Wansink 的实际研究实践与幼稚模型的差距: + +> …早在 2008 年 9 月,佩恩在收集数据后不久就开始查看数据,但他没有发现任何强大的苹果和埃尔莫链接——至少目前还没有。……佩恩在给他的合作者的信中说:“我已经把孩子研究的一些初步结果附在这封信上,以供你的报告。”“不要绝望。看起来水果上的贴纸可能会起作用(用更多的魔法)。Wansink 也承认这篇论文很差,因为他正准备将其提交给期刊。P 值为 0.06,略低于黄金标准 0.05 的临界值。正如他在 2012 年 1 月 7 日的一封电子邮件中所说,这是一个“症结”。……“在我看来应该更低,”他写道,并附上了一份草案。“你想看看它,看看你的想法吗?如果你能得到数据,它需要一些镊子,最好是得到低于 0.05 的一个值。2012 年晚些时候,这项研究出现在久负盛名的牙买加儿科,0.06 p 值完好无损。但在 2017 年 9 月,它被收回并替换为一个版本,该版本的 p 值为 0.02。一个月后,它又被收回了,原因完全不同:Wansink 承认,这项实验并没有像他最初声称的那样在 8 到 11 岁的孩子身上进行,而是在学龄前儿童身上进行。 + +这种行为最终赶上了 Wansink;[他的 15 项研究被撤回](https://www.vox.com/science-and-health/2018/9/19/17879102/brian-wansink-cornell-food-brand-lab-retractions-jama),2018 年他辞去了康奈尔大学的教职。 + +## 17.3 科学中的再现性危机 + +人们可能希望布莱恩·万辛克是一个罕见的异类,但越来越清楚的是,在科学中,再现性问题比以前想象的要普遍得多。这一点在 2015 年变得清晰起来,当时一大群研究人员在名为“评估心理科学的再现性”的杂志 _Science_ 上发表了一项研究(开放科学合作 2015)。在这项研究中,研究者们选取了 100 项已发表的心理学研究成果,并试图复制论文最初报道的结果。他们的发现令人震惊:尽管 97%的原始论文报告了具有统计学意义的发现,但在复制研究中只有 37%的这些影响具有统计学意义。尽管心理学中的这些问题受到了广泛关注,但它们似乎存在于几乎所有科学领域,从癌症生物学(Errington 等人 2014 年)和化学(Baker 2017 年)到经济学(Christensen 和 Miguel 2016 年)和社会科学(Camerer 等人 2018 年)。 + +2010 年之后出现的再现性危机实际上是由斯坦福大学的一位医生约翰·伊奥尼迪斯预测的,他在 2005 年写了一篇题为“为什么大多数发表的研究结果都是错误的”(伊奥尼迪斯,2005 年)的论文。在本文中,伊奥尼迪斯认为,在现代科学的背景下使用零假设统计检验必然会导致高水平的错误结果。 + +# + +## 17.3.1 阳性预测值及统计意义 + +ioannidis 的分析侧重于一个被称为 _ 阳性预测值 _ 的概念,定义为阳性结果(通常翻译为“统计显著结果”)的比例,这是正确的: + +![](img/0df713adef653ad0c4cdfe16ae1b35b4.jpg) + +假设我们知道我们的假设是正确的概率(![](img/49a70b558c8f0b5046d140d7520f8780.jpg)),那么一个真正的正结果的概率就是![](img/49a70b558c8f0b5046d140d7520f8780.jpg)乘以研究的统计能力: + +![](img/dde51223a9c7d44ac8a744da6fbb7538.jpg) + +were![](img/50705df736e9a7919e768cf8c4e4f794.jpg)为假阴性率。假阳性结果的概率由![](img/49a70b558c8f0b5046d140d7520f8780.jpg)和假阳性率![](img/82005cc2e0087e2a52c7e43df4a19a00.jpg)决定: + +![](img/885abff2d188d055f0e3777842da63c2.jpg) + +PPV 的定义如下: + +![](img/335982a922e0209345ab864a3b75f57e.jpg) + +我们先举一个例子,假设为真的概率很高,比如说 0.8——但是请注意,一般来说,我们不能真正知道这个概率。假设我们使用标准值![](img/ce71e9ccc9f7b0f4bdf7302eed1c0dc1.jpg)和![](img/5224faaa8f34ea50bb8db3d4c2e6c0a4.jpg)进行研究。我们可以将 ppv 计算为: + +![](img/333f6e97e318323e406e54f8e474bbbe.jpg) + +这意味着,如果我们在一项假设很可能是真实的、权力很高的研究中发现一个积极的结果,那么它成为真实的可能性很高。然而,请注意,假设具有如此高的真实可能性的研究领域可能不是一个非常有趣的研究领域;当研究告诉我们一些新的东西时,它是最重要的! + +让我们对一个字段进行相同的分析,其中![](img/7ed9ba8f5547ac3985821966cba7d82d.jpg)——也就是说,测试的大多数假设都是错误的。在这种情况下,PPV 是: + +![](img/a92bd32242abe2fb70d4035c8cbae9b3.jpg) + +这意味着,在一个大多数假设都可能是错误的领域(也就是说,一个有趣的科学领域,研究人员正在测试风险假设),即使我们发现了一个积极的结果,也更可能是错误的,而不是真的!事实上,这只是我们在假设检验中讨论的基础利率效应的另一个例子——当结果不太可能出现时,几乎可以肯定的是,大多数积极的结果将是假阳性。 + +我们可以模拟这一点,以显示 ppv 与统计功率的关系,作为假设为真的先验概率的函数(参见图[17.1](#fig:PPVsim)) + +![A simulation of posterior predictive value as a function of statistical power (plotted on the x axis) and prior probability of the hypothesis being true (plotted as separate lines).](img/file98.png) + +图 17.1 后验预测值作为统计功率函数(绘制在 x 轴上)的模拟,假设的前验概率为真(绘制为单独的线)。 + +不幸的是,许多科学领域的统计能力仍然很低(Smaldino 和 McElreath,2016 年),这表明许多已发表的研究结果都是错误的。 + +# + +## 17.3.2 胜利者的诅咒 + +另一种错误也可能发生在统计能力较低的时候:我们对影响大小的估计将被夸大。这种现象经常被称为“赢家的诅咒”,它来自经济学,它指的是,对于某些类型的拍卖(每个人的价值都是一样的,就像一罐 25 美分的硬币,而竞拍是私人的),赢家几乎总是支付比好的东西更高的价格。.在科学中,赢家的诅咒是指根据重大结果(即赢家)估计的效果大小几乎总是高估真实效果大小的事实。 + +我们可以对此进行模拟,以了解重要结果的估计效果大小与实际潜在效果大小之间的关系。让我们生成真实效果大小为 0.2 的数据,并在检测到显著效果的情况下估计这些结果的效果大小。图[17.2](#fig:CurseSim)显示,当功率较低时,与实际效果大小相比,显著结果的估计效果大小可能会大大膨胀。 + +![A simulation of the winner's curse as a function of statistical power (x axis). The black line shows the estimated effect size, and the red dashed line shows the actual effect size. ](img/file99.png) + +图 17.2 胜利者诅咒作为统计幂函数(x 轴)的模拟。黑线显示估计的效果大小,红色虚线显示实际的效果大小。 + +![A histogram showing sample sizes for a number of samples from a dataset, with significant results shown in blue and non-significant results in red.](img/file100.png) + +图 17.3 一个柱状图,显示数据集中若干样本的样本大小,显著结果以蓝色显示,非显著结果以红色显示。 + +我们可以通过一个模拟来了解为什么会出现这种情况。在图[17.3](#fig:curseSimSingle)中,您可以看到 1000 个样本的估计效果大小的柱状图,通过测试是否具有统计意义来分隔。从图中可以清楚地看到,如果我们仅仅根据显著的结果来估计效果大小,那么我们的估计就会膨胀;只有当大多数结果都是显著的(即功率高,效果相对较大)时,我们的估计才会接近实际的效果大小。 + +## 17.4 有问题的研究实践 + +美国心理协会(Darley,Zanna,and Roediger 2004)出版了一本名为《完整的学术:职业指南》的畅销书,旨在为有抱负的研究人员提供如何建立职业生涯的指导。在著名社会心理学家 DarylBem 撰写的题为“撰写实证期刊文章”的一章中,Bem 就如何撰写研究论文提出了一些建议。不幸的是,他所建议的实践存在严重的问题,并被称为 _ 有问题的研究实践 _(QRPS)。 + +> **你应该写哪篇文章?**你可以写两篇文章:(1)你计划在设计你的研究时写的文章,或(2)你已经看到结果后最有意义的文章。它们很少相同,正确答案是(2)。 + +BEM 在这里提出的建议被称为 _Harking_(在结果已知后进行假设)(Kerr 1998)。这可能看起来无害,但有问题,因为它允许研究重新构建一个事后结论(我们应该用一点盐)作为先验预测(我们会有更强的信心)。从本质上讲,它允许研究人员根据事实重写他们的理论,而不是使用该理论进行预测,然后测试它们——类似于移动球门柱,以便球在任何地方移动。因此,很难推翻错误的想法,因为始终可以移动门柱来匹配数据。 + +> **分析数据**从各个角度检查数据。分别分析性别。组成新的综合指数。如果一个数据表明了一个新的假设,试着在数据的其他地方找到进一步的证据。如果您看到有趣模式的模糊痕迹,请尝试重新组织数据,使其变得更大胆。如果有你不喜欢的参与者,或是试验、观察者或是面试官给了你不正常的结果,暂时放弃他们。去钓鱼探险,寻找一些有趣的东西。不,这不是不道德的。 + +BEM 在这里建议的是 _p-hacking_,它指的是尝试许多不同的分析,直到找到显著的结果。BEM 是正确的,如果一个人报告对数据所做的每一个分析,那么这种方法就不会是“不道德的”。然而,很少有论文讨论对数据集执行的所有分析;相反,论文通常只提供 _ 起作用的分析 _——这通常意味着他们发现了一个具有统计意义的结果。有许多不同的方法,一个人可以 p-hack: + +* 分析每个主题后的数据,一旦 p<;.05 停止收集数据。 +* 分析许多不同的变量,但只报告具有 P<;.05 的变量。 +* 收集许多不同的实验条件,但只报告那些与 P<;.05 +* 排除参与者以获取 P<;.05 +* 转换数据以获取 P<;.05 + +Simmons、Nelson 和 Simonsohn(2011)的一篇著名论文表明,使用这些 P-hacking 策略可以大大提高实际的假阳性率,从而导致大量的假阳性结果。 + +# + +## 17.4.1 ESP 或 QRP? + +2011 年,DarylBem 发表了一篇文章(Bem2011),声称发现了超感官知觉的科学证据。文章指出: + +> 本文报告了 9 个实验,涉及 1000 多名参与者,通过“时间倒转”确定的心理效应来测试追溯影响,以便在假定的因果刺激事件发生之前获得个体的反应。…在所有 9 个实验中,psi 性能的平均效应大小(d)为 0.22,除一个实验外,所有实验都产生了统计上显著的结果。 + +当研究人员开始研究 bem 的文章时,很明显他参与了他在上面讨论的章节中推荐的所有 qrps。正如 TalYarkoni 在[一篇博客文章中指出的那样,文章](http://www.talyarkoni.org/blog/2011/01/10/the-psychology-of-parapsychology-or-why-good-researchers-publishing-good-articles-in-good-journals-can-still-get-it-totally-wrong/): + +* 不同研究的样本量不同 +* 不同的研究似乎被集中在一起或分开。 +* 这些研究允许许多不同的假设,还不清楚提前计划了哪些假设。 +* BEM 使用了单尾测试,即使还不清楚是否有方向性预测(因此 alpha 实际上是 0.1) +* 大多数 p 值非常接近 0.05。 +* 目前还不清楚还有多少其他的研究在进行,但没有报道。 + +## 17.5 进行重复性研究 + +在再现性危机爆发的几年里,有一个强有力的运动来开发工具来帮助保护科学研究的再现性。 + +# + +## 17.5.1 预注册 + +获得最大吸引力的想法之一是 _ 预注册 _,其中一个将研究的详细描述(包括所有数据分析)提交给受信任的存储库(如[开放科学框架](http://osf.io)或[aspredected.org](http://aspredicted.org))。通过在分析数据之前详细说明一个人的计划,预注册提供了更大的信心,即分析不会受到 P-Hacking 或其他可疑的研究实践的影响。 + +预注册的效果已经在医学临床试验中看到。2000 年,国家心脏、肺和血液研究所(NHLBI)开始要求使用[clinical trials.gov](http://clinicaltrials.gov)上的系统对所有临床试验进行预注册。这为观察研究预注册的效果提供了一个自然的实验。当 Kaplan 和 Irvin(2015)研究了随着时间推移的临床试验结果时,他们发现 2000 年后临床试验的阳性结果数量比以前减少了。虽然有许多可能的原因,但似乎在研究注册之前,研究人员能够改变他们的方法,以找到一个积极的结果,这在注册后变得更加困难。 + +# + +## 17.5.2 可复制实践 + +Simmons、Nelson 和 Simonsohn(2011)的论文提出了一套建议做法,以使研究更具可重复性,所有这些做法都应成为研究人员的标准: + +> * 作者必须在数据收集开始之前决定终止数据收集的规则,并在文章中报告此规则。 +> * 操作者必须为每个单元收集至少 20 个观察结果,否则将产生命令人信任服务的数据收集成成本。 +> * 作者必须列出研究中收集的所有变量。 +> * 操作者必须报告所有实验条件,包括失败的操作。 +> * 如果消除了观察结果,则操作者还必须报告统计结果(如果包括这些观察结果)。 +> * 如果分析包含协变量,则操作者必须报告分析的统计结果而不包含协变量。【htg12】【htg13】 + +# + +## 17.5.3 复制 + +科学的一个标志就是复制(htg0)的思想,也就是说,其他研究人员应该能够进行相同的研究并获得相同的结果。不幸的是,正如我们在前面讨论的复制项目的结果中看到的,许多发现是不可复制的。确保研究的可复制性的最好方法是首先自己复制它;对于某些研究来说,这是不可能的,但只要有可能,就应该确保在新的样本中可以找到它。新的样本应该有足够的能量来找到感兴趣的效果大小;在许多情况下,这实际上需要比原始样本更大的样本。 + +在复制方面记住一些事情是很重要的。首先,复制尝试失败并不一定意味着原始发现是错误的;请记住,在 80%功率的标准水平下,仍然有五分之一的机会结果是无意义的,即使有真正的效果。出于这个原因,在我们开始相信任何重要发现之前,我们通常希望看到它的多重复制。不幸的是,包括心理学在内的许多领域在过去都未能遵循这一建议,导致“教科书”的发现很可能是错误的。关于 Daryl Bem 的 ESP 研究,涉及 7 项研究的大规模复制尝试未能复制他的发现(Galak 等人 2012 年)。 + +第二,记住,p 值并不能为我们提供一个发现复制可能性的度量。正如我们之前讨论过的,p 值是一个关于在特定的空假设下一个人的数据的可能性的陈述;它没有告诉我们关于发现实际上是真的概率的任何事情(正如我们在贝叶斯分析一章中所了解的)。为了知道复制的可能性,我们需要知道发现是真的概率,而我们通常不知道。 + +## 17.6 进行重复性数据分析 + +到目前为止,我们专注于在新的实验中复制其他研究人员的发现的能力,但再现性的另一个重要方面是能够根据某人自己的数据复制分析,我们称之为 _ 计算再现性。_ 这要求研究人员共享他们的数据和分析代码,这样其他研究人员就可以尝试复制结果,也可以对相同的数据测试不同的分析方法。心理学朝着开放共享代码和数据的方向发展的趋势越来越多;例如,《心理科学》杂志(HTG2)现在为共享研究材料、数据和代码以及预注册的论文提供了“徽章”。 + +重现分析的能力是我们强烈提倡使用脚本化分析(例如那些使用 R 的分析)而不是使用“点击式”软件包的一个原因。这也是我们提倡使用免费和开源软件(如 R)而不是商业软件包的原因,商业软件包将要求其他人购买软件以复制任何分析。 + +有很多方法可以共享代码和数据。共享代码的一种常见方式是通过支持 _ 版本控制 _ 软件的网站,如[github](http://github.com)。小数据集也可以通过这些相同的站点共享;大数据集可以通过数据共享门户(如[Zenodo](https://zenodo.org/))共享,或者通过专门的门户(如[OpenNeuro](http://openneuro.org)用于神经成像数据)共享。 + +## 17.7 结论:提高科学水平 + +每一位科学家都有责任改进他们的研究实践,以提高他们研究的再现性。重要的是要记住,研究的目的不是找到一个重要的结果;相反,它是以最真实的方式询问和回答关于自然的问题。我们的大多数假设都是错误的,我们应该对此感到欣慰,这样当我们找到一个正确的假设时,我们会对它的真实性更加自信。 + +## 17.8 阅读建议 + +* [理查德哈里斯(Richard Harris)的《僵尸:草率的科学如何创造毫无价值的治疗、粉碎希望和浪费数十亿美元》(Rigor Mortis:How Sloppy Science Creates Worless Cures,Crushes Hope,and Wasters Billiums)](https://www.amazon.com/dp/B01K3WN72C) +* [改进统计推断](https://www.coursera.org/learn/statistical-inferences)——关于如何更好地进行统计分析的在线课程,包括本章提出的许多观点。 \ No newline at end of file diff --git a/docs/17.x2.md b/docs/17.x2.md deleted file mode 100644 index 10bf215ebacf6ccea1a5c22d209276f1fcc75ad3..0000000000000000000000000000000000000000 --- a/docs/17.x2.md +++ /dev/null @@ -1,176 +0,0 @@ -# 17 做重复性研究 - -大多数人认为科学是回答世界问题的可靠方法。当我们的医生开出治疗处方时,我们相信通过研究已经证明它是有效的,我们也有类似的信念,即我们乘坐的飞机不会从天上掉下来。然而,自 2005 年以来,人们越来越担心科学可能不会一直像我们长久以来认为的那样有效。在本章中,我们将讨论这些关于科学研究再现性的问题,并概述可以采取的步骤,以确保我们的统计结果尽可能具有再现性。 - -## 17.1 我们认为科学应该如何运作 - -假设我们对一个关于孩子如何选择吃什么的研究项目感兴趣。这是著名的饮食研究者布莱恩·万辛克和他的同事在 2012 年的一项研究中提出的一个问题。标准(正如我们将看到的,有些幼稚)的观点是这样的: - -* 你从一个假设开始 -* 用流行人物做品牌应该能让孩子们更频繁地选择“健康”食品。 -* 你收集了一些数据 -* 让孩子们在饼干和苹果之间做出选择,要么贴上 Elmo 品牌的标签,要么贴上控制标签,并记录下他们的选择。 -* 你做统计来检验无效假设 -* “预先计划的比较显示,Elmo 品牌的苹果与儿童选择苹果的比例从 20.7%增加到 33.8%(htg0=5.158;p=0.02)”(Wansink、Just 和 Payne 2012) -* 你根据这些数据得出结论*“这项研究表明,使用品牌或吸引人的品牌特征可能比使用放纵的、经过高度加工的食品更有益于健康的食品。正如吸引人的名字已经被证明可以增加学校午餐室对健康食品的选择一样,品牌和卡通人物对幼儿也有同样的作用。”(Wansink,Just 和 Payne 2012) - -## 17.2 科学(有时)是如何工作的 - -布莱恩·万辛克以他的《无意识饮食》一书而闻名,他参加公司演讲会的费用是几万美元。2017 年,一组研究人员开始仔细研究他发表的一些研究,从一组关于人们在自助餐厅吃多少比萨饼的论文开始。研究人员要求 Wansink 分享这些研究的数据,但他拒绝了,所以他们仔细研究了他的论文,发现论文中存在大量的不一致和统计问题。围绕这一分析的宣传导致了其他一些人深入研究了 Wansink 的过去,包括在 Wansink 和他的合作者之间获取电子邮件。正如 Stephanie Lee 在 BuzzFeed 上报道的那样,这些电子邮件显示了 Wansink 的实际研究实践与幼稚模型的差距: - -> …早在 2008 年 9 月,佩恩在收集数据后不久就开始查看数据,但他没有发现任何强大的苹果和埃尔莫链接——至少目前还没有。……佩恩在给他的合作者的信中说:“我已经把孩子研究的一些初步结果附在这封信上,以供你的报告。”“不要绝望。看起来水果上的贴纸可能会起作用(用更多的魔法)。Wansink 也承认这篇论文很差,因为他正准备将其提交给期刊。P 值为 0.06,略低于黄金标准 0.05 的临界值。正如他在 2012 年 1 月 7 日的一封电子邮件中所说,这是一个“症结”。……“在我看来应该更低,”他写道,并附上了一份草案。“你想看看它,看看你的想法吗?如果你能得到数据,它需要一些镊子,最好是得到低于 0.05 的一个值。2012 年晚些时候,这项研究出现在久负盛名的牙买加儿科,0.06 p 值完好无损。但在 2017 年 9 月,它被收回并替换为一个版本,该版本的 p 值为 0.02。一个月后,它又被收回了,原因完全不同:Wansink 承认,这项实验并没有像他最初声称的那样在 8 到 11 岁的孩子身上进行,而是在学龄前儿童身上进行。 - -这种行为最终赶上了 Wansink;[他的 15 项研究被撤回](https://www.vox.com/science-and-health/2018/9/19/17879102/brian-wansink-cornell-food-brand-lab-retractions-jama),2018 年他辞去了康奈尔大学的教职。 - -## 17.3 科学中的再现性危机 - -人们可能希望布莱恩·万辛克是一个罕见的异类,但越来越清楚的是,在科学中,再现性问题比以前想象的要普遍得多。这一点在 2015 年变得清晰起来,当时一大群研究人员在名为“评估心理科学的再现性”的杂志 _Science_ 上发表了一项研究(开放科学合作 2015)。在这项研究中,研究者们选取了 100 项已发表的心理学研究成果,并试图复制论文最初报道的结果。他们的发现令人震惊:尽管 97%的原始论文报告了具有统计学意义的发现,但在复制研究中只有 37%的这些影响具有统计学意义。尽管心理学中的这些问题受到了广泛关注,但它们似乎存在于几乎所有科学领域,从癌症生物学(Errington 等人 2014 年)和化学(Baker 2017 年)到经济学(Christensen 和 Miguel 2016 年)和社会科学(Camerer 等人 2018 年)。 - -2010 年之后出现的再现性危机实际上是由斯坦福大学的一位医生约翰·伊奥尼迪斯预测的,他在 2005 年写了一篇题为“为什么大多数发表的研究结果都是错误的”(伊奥尼迪斯,2005 年)的论文。在本文中,伊奥尼迪斯认为,在现代科学的背景下使用零假设统计检验必然会导致高水平的错误结果。 - -# - -## 17.3.1 阳性预测值及统计意义 - -ioannidis 的分析侧重于一个被称为 _ 阳性预测值 _ 的概念,定义为阳性结果(通常翻译为“统计显著结果”)的比例,这是正确的: - -![](img/0df713adef653ad0c4cdfe16ae1b35b4.jpg) - -假设我们知道我们的假设是正确的概率(![](img/49a70b558c8f0b5046d140d7520f8780.jpg)),那么一个真正的正结果的概率就是![](img/49a70b558c8f0b5046d140d7520f8780.jpg)乘以研究的统计能力: - -![](img/dde51223a9c7d44ac8a744da6fbb7538.jpg) - -were![](img/50705df736e9a7919e768cf8c4e4f794.jpg)为假阴性率。假阳性结果的概率由![](img/49a70b558c8f0b5046d140d7520f8780.jpg)和假阳性率![](img/82005cc2e0087e2a52c7e43df4a19a00.jpg)决定: - -![](img/885abff2d188d055f0e3777842da63c2.jpg) - -PPV 的定义如下: - -![](img/335982a922e0209345ab864a3b75f57e.jpg) - -我们先举一个例子,假设为真的概率很高,比如说 0.8——但是请注意,一般来说,我们不能真正知道这个概率。假设我们使用标准值![](img/ce71e9ccc9f7b0f4bdf7302eed1c0dc1.jpg)和![](img/5224faaa8f34ea50bb8db3d4c2e6c0a4.jpg)进行研究。我们可以将 ppv 计算为: - -![](img/333f6e97e318323e406e54f8e474bbbe.jpg) - -这意味着,如果我们在一项假设很可能是真实的、权力很高的研究中发现一个积极的结果,那么它成为真实的可能性很高。然而,请注意,假设具有如此高的真实可能性的研究领域可能不是一个非常有趣的研究领域;当研究告诉我们一些新的东西时,它是最重要的! - -让我们对一个字段进行相同的分析,其中![](img/7ed9ba8f5547ac3985821966cba7d82d.jpg)——也就是说,测试的大多数假设都是错误的。在这种情况下,PPV 是: - -![](img/a92bd32242abe2fb70d4035c8cbae9b3.jpg) - -这意味着,在一个大多数假设都可能是错误的领域(也就是说,一个有趣的科学领域,研究人员正在测试风险假设),即使我们发现了一个积极的结果,也更可能是错误的,而不是真的!事实上,这只是我们在假设检验中讨论的基础利率效应的另一个例子——当结果不太可能出现时,几乎可以肯定的是,大多数积极的结果将是假阳性。 - -我们可以模拟这一点,以显示 ppv 与统计功率的关系,作为假设为真的先验概率的函数(参见图[17.1](#fig:PPVsim)) - -![A simulation of posterior predictive value as a function of statistical power (plotted on the x axis) and prior probability of the hypothesis being true (plotted as separate lines).](img/file98.png) - -图 17.1 后验预测值作为统计功率函数(绘制在 x 轴上)的模拟,假设的前验概率为真(绘制为单独的线)。 - -不幸的是,许多科学领域的统计能力仍然很低(Smaldino 和 McElreath,2016 年),这表明许多已发表的研究结果都是错误的。 - -# - -## 17.3.2 胜利者的诅咒 - -另一种错误也可能发生在统计能力较低的时候:我们对影响大小的估计将被夸大。这种现象经常被称为“赢家的诅咒”,它来自经济学,它指的是,对于某些类型的拍卖(每个人的价值都是一样的,就像一罐 25 美分的硬币,而竞拍是私人的),赢家几乎总是支付比好的东西更高的价格。.在科学中,赢家的诅咒是指根据重大结果(即赢家)估计的效果大小几乎总是高估真实效果大小的事实。 - -我们可以对此进行模拟,以了解重要结果的估计效果大小与实际潜在效果大小之间的关系。让我们生成真实效果大小为 0.2 的数据,并在检测到显著效果的情况下估计这些结果的效果大小。图[17.2](#fig:CurseSim)显示,当功率较低时,与实际效果大小相比,显著结果的估计效果大小可能会大大膨胀。 - -![A simulation of the winner's curse as a function of statistical power (x axis). The black line shows the estimated effect size, and the red dashed line shows the actual effect size. ](img/file99.png) - -图 17.2 胜利者诅咒作为统计幂函数(x 轴)的模拟。黑线显示估计的效果大小,红色虚线显示实际的效果大小。 - -![A histogram showing sample sizes for a number of samples from a dataset, with significant results shown in blue and non-significant results in red.](img/file100.png) - -图 17.3 一个柱状图,显示数据集中若干样本的样本大小,显著结果以蓝色显示,非显著结果以红色显示。 - -我们可以通过一个模拟来了解为什么会出现这种情况。在图[17.3](#fig:curseSimSingle)中,您可以看到 1000 个样本的估计效果大小的柱状图,通过测试是否具有统计意义来分隔。从图中可以清楚地看到,如果我们仅仅根据显著的结果来估计效果大小,那么我们的估计就会膨胀;只有当大多数结果都是显著的(即功率高,效果相对较大)时,我们的估计才会接近实际的效果大小。 - -## 17.4 有问题的研究实践 - -美国心理协会(Darley,Zanna,and Roediger 2004)出版了一本名为《完整的学术:职业指南》的畅销书,旨在为有抱负的研究人员提供如何建立职业生涯的指导。在著名社会心理学家 DarylBem 撰写的题为“撰写实证期刊文章”的一章中,Bem 就如何撰写研究论文提出了一些建议。不幸的是,他所建议的实践存在严重的问题,并被称为 _ 有问题的研究实践 _(QRPS)。 - -> **你应该写哪篇文章?**你可以写两篇文章:(1)你计划在设计你的研究时写的文章,或(2)你已经看到结果后最有意义的文章。它们很少相同,正确答案是(2)。 - -BEM 在这里提出的建议被称为 _Harking_(在结果已知后进行假设)(Kerr 1998)。这可能看起来无害,但有问题,因为它允许研究重新构建一个事后结论(我们应该用一点盐)作为先验预测(我们会有更强的信心)。从本质上讲,它允许研究人员根据事实重写他们的理论,而不是使用该理论进行预测,然后测试它们——类似于移动球门柱,以便球在任何地方移动。因此,很难推翻错误的想法,因为始终可以移动门柱来匹配数据。 - -> **分析数据**从各个角度检查数据。分别分析性别。组成新的综合指数。如果一个数据表明了一个新的假设,试着在数据的其他地方找到进一步的证据。如果您看到有趣模式的模糊痕迹,请尝试重新组织数据,使其变得更大胆。如果有你不喜欢的参与者,或是试验、观察者或是面试官给了你不正常的结果,暂时放弃他们。去钓鱼探险,寻找一些有趣的东西。不,这不是不道德的。 - -BEM 在这里建议的是 _p-hacking_,它指的是尝试许多不同的分析,直到找到显著的结果。BEM 是正确的,如果一个人报告对数据所做的每一个分析,那么这种方法就不会是“不道德的”。然而,很少有论文讨论对数据集执行的所有分析;相反,论文通常只提供 _ 起作用的分析 _——这通常意味着他们发现了一个具有统计意义的结果。有许多不同的方法,一个人可以 p-hack: - -* 分析每个主题后的数据,一旦 p<;.05 停止收集数据。 -* 分析许多不同的变量,但只报告具有 P<;.05 的变量。 -* 收集许多不同的实验条件,但只报告那些与 P<;.05 -* 排除参与者以获取 P<;.05 -* 转换数据以获取 P<;.05 - -Simmons、Nelson 和 Simonsohn(2011)的一篇著名论文表明,使用这些 P-hacking 策略可以大大提高实际的假阳性率,从而导致大量的假阳性结果。 - -# - -## 17.4.1 ESP 或 QRP? - -2011 年,DarylBem 发表了一篇文章(Bem2011),声称发现了超感官知觉的科学证据。文章指出: - -> 本文报告了 9 个实验,涉及 1000 多名参与者,通过“时间倒转”确定的心理效应来测试追溯影响,以便在假定的因果刺激事件发生之前获得个体的反应。…在所有 9 个实验中,psi 性能的平均效应大小(d)为 0.22,除一个实验外,所有实验都产生了统计上显著的结果。 - -当研究人员开始研究 bem 的文章时,很明显他参与了他在上面讨论的章节中推荐的所有 qrps。正如 TalYarkoni 在[一篇博客文章中指出的那样,文章](http://www.talyarkoni.org/blog/2011/01/10/the-psychology-of-parapsychology-or-why-good-researchers-publishing-good-articles-in-good-journals-can-still-get-it-totally-wrong/): - -* 不同研究的样本量不同 -* 不同的研究似乎被集中在一起或分开。 -* 这些研究允许许多不同的假设,还不清楚提前计划了哪些假设。 -* BEM 使用了单尾测试,即使还不清楚是否有方向性预测(因此 alpha 实际上是 0.1) -* 大多数 p 值非常接近 0.05。 -* 目前还不清楚还有多少其他的研究在进行,但没有报道。 - -## 17.5 进行重复性研究 - -在再现性危机爆发的几年里,有一个强有力的运动来开发工具来帮助保护科学研究的再现性。 - -# - -## 17.5.1 预注册 - -获得最大吸引力的想法之一是 _ 预注册 _,其中一个将研究的详细描述(包括所有数据分析)提交给受信任的存储库(如[开放科学框架](http://osf.io)或[aspredected.org](http://aspredicted.org))。通过在分析数据之前详细说明一个人的计划,预注册提供了更大的信心,即分析不会受到 P-Hacking 或其他可疑的研究实践的影响。 - -预注册的效果已经在医学临床试验中看到。2000 年,国家心脏、肺和血液研究所(NHLBI)开始要求使用[clinical trials.gov](http://clinicaltrials.gov)上的系统对所有临床试验进行预注册。这为观察研究预注册的效果提供了一个自然的实验。当 Kaplan 和 Irvin(2015)研究了随着时间推移的临床试验结果时,他们发现 2000 年后临床试验的阳性结果数量比以前减少了。虽然有许多可能的原因,但似乎在研究注册之前,研究人员能够改变他们的方法,以找到一个积极的结果,这在注册后变得更加困难。 - -# - -## 17.5.2 可复制实践 - -Simmons、Nelson 和 Simonsohn(2011)的论文提出了一套建议做法,以使研究更具可重复性,所有这些做法都应成为研究人员的标准: - -> * 作者必须在数据收集开始之前决定终止数据收集的规则,并在文章中报告此规则。 -> * 操作者必须为每个单元收集至少 20 个观察结果,否则将产生命令人信任服务的数据收集成成本。 -> * 作者必须列出研究中收集的所有变量。 -> * 操作者必须报告所有实验条件,包括失败的操作。 -> * 如果消除了观察结果,则操作者还必须报告统计结果(如果包括这些观察结果)。 -> * 如果分析包含协变量,则操作者必须报告分析的统计结果而不包含协变量。【htg12】【htg13】 - -# - -## 17.5.3 复制 - -科学的一个标志就是复制(htg0)的思想,也就是说,其他研究人员应该能够进行相同的研究并获得相同的结果。不幸的是,正如我们在前面讨论的复制项目的结果中看到的,许多发现是不可复制的。确保研究的可复制性的最好方法是首先自己复制它;对于某些研究来说,这是不可能的,但只要有可能,就应该确保在新的样本中可以找到它。新的样本应该有足够的能量来找到感兴趣的效果大小;在许多情况下,这实际上需要比原始样本更大的样本。 - -在复制方面记住一些事情是很重要的。首先,复制尝试失败并不一定意味着原始发现是错误的;请记住,在 80%功率的标准水平下,仍然有五分之一的机会结果是无意义的,即使有真正的效果。出于这个原因,在我们开始相信任何重要发现之前,我们通常希望看到它的多重复制。不幸的是,包括心理学在内的许多领域在过去都未能遵循这一建议,导致“教科书”的发现很可能是错误的。关于 Daryl Bem 的 ESP 研究,涉及 7 项研究的大规模复制尝试未能复制他的发现(Galak 等人 2012 年)。 - -第二,记住,p 值并不能为我们提供一个发现复制可能性的度量。正如我们之前讨论过的,p 值是一个关于在特定的空假设下一个人的数据的可能性的陈述;它没有告诉我们关于发现实际上是真的概率的任何事情(正如我们在贝叶斯分析一章中所了解的)。为了知道复制的可能性,我们需要知道发现是真的概率,而我们通常不知道。 - -## 17.6 进行重复性数据分析 - -到目前为止,我们专注于在新的实验中复制其他研究人员的发现的能力,但再现性的另一个重要方面是能够根据某人自己的数据复制分析,我们称之为 _ 计算再现性。_ 这要求研究人员共享他们的数据和分析代码,这样其他研究人员就可以尝试复制结果,也可以对相同的数据测试不同的分析方法。心理学朝着开放共享代码和数据的方向发展的趋势越来越多;例如,《心理科学》杂志(HTG2)现在为共享研究材料、数据和代码以及预注册的论文提供了“徽章”。 - -重现分析的能力是我们强烈提倡使用脚本化分析(例如那些使用 R 的分析)而不是使用“点击式”软件包的一个原因。这也是我们提倡使用免费和开源软件(如 R)而不是商业软件包的原因,商业软件包将要求其他人购买软件以复制任何分析。 - -有很多方法可以共享代码和数据。共享代码的一种常见方式是通过支持 _ 版本控制 _ 软件的网站,如[github](http://github.com)。小数据集也可以通过这些相同的站点共享;大数据集可以通过数据共享门户(如[Zenodo](https://zenodo.org/))共享,或者通过专门的门户(如[OpenNeuro](http://openneuro.org)用于神经成像数据)共享。 - -## 17.7 结论:提高科学水平 - -每一位科学家都有责任改进他们的研究实践,以提高他们研究的再现性。重要的是要记住,研究的目的不是找到一个重要的结果;相反,它是以最真实的方式询问和回答关于自然的问题。我们的大多数假设都是错误的,我们应该对此感到欣慰,这样当我们找到一个正确的假设时,我们会对它的真实性更加自信。 - -## 17.8 阅读建议 - -* [理查德哈里斯(Richard Harris)的《僵尸:草率的科学如何创造毫无价值的治疗、粉碎希望和浪费数十亿美元》(Rigor Mortis:How Sloppy Science Creates Worless Cures,Crushes Hope,and Wasters Billiums)](https://www.amazon.com/dp/B01K3WN72C) -* [改进统计推断](https://www.coursera.org/learn/statistical-inferences)——关于如何更好地进行统计分析的在线课程,包括本章提出的许多观点。 \ No newline at end of file diff --git a/docs/2.md b/docs/2.md index b7a3e2ee14d8fcaf69748a99f580b0e316891e80..7b4209b52ebb3ea12fd987f24a2e129e5ea34599 100644 --- a/docs/2.md +++ b/docs/2.md @@ -1 +1,185 @@ -# 2 处理数据 \ No newline at end of file +# 2 处理数据 + +## 2.1 什么是数据? + +关于数据的第一个重要点是数据 _ 是 _——意思是“数据”这个词是复数(尽管有些人在这一点上不同意我的观点)。你也可能想知道如何发音“data”——我说“day-tah”,但我认识许多说“dah-tah”的人,尽管如此,我仍然可以和他们保持朋友关系。现在如果我听到他们说“数据是”,那将是更大的问题… + +# + +## 2.1.1 定性数据 + +数据由 _ 变量 _ 组成,其中变量反映唯一的度量或数量。有些变量是 _ 定性的 _,这意味着它们描述的是质量而不是数字量。例如,在我的统计课程中,我通常会做一个介绍性的调查,既可以获取课堂上使用的数据,也可以了解更多关于学生的信息。我问的问题之一是“你最喜欢吃什么?”其中一些答案是:蓝莓、巧克力、玉米粉蒸肉、意大利面、披萨和芒果。这些数据本质上不是数字;我们可以为每个数据分配数字(1=蓝莓,2=巧克力等),但我们只会将数字用作标签,而不是实数;例如,在这种情况下,将数字相加是没有意义的。但是,我们通常会使用数字对定性数据进行编码,以使它们更易于使用,稍后您将看到。 + +# + +## 2.1.2 定量数据 + +在统计学中,我们更常用于 _ 定量 _ 数据,这意味着数据是数字的。例如,这里的表[2.1](#tab:WhyTakingClass)显示了我在入门课上问的另一个问题的结果,即“你为什么要上这门课?” + +Table 2.1 Counts of the prevalence of different responses to the question "Why are you taking this class?" +| 你为什么要上这门课? | 学生人数 | +| --- | --- | +| 满足学位计划要求 | 105 | +| 满足通识教育广度要求 | 32 | +| 不需要,但我对这个话题感兴趣 | 11 个 | +| 其他 | 4 | + +请注意,学生的回答是定性的,但我们通过计算每个回答的学生数得出了他们的定量总结。 + +## + +## 2.1.2.1 数字类型 + +我们在统计中处理的数字有几种不同的类型。理解这些差异很重要,部分原因是像 R 这样的编程语言经常区分它们。 + +**二进制数**。最简单的是二进制数——也就是零或一。我们经常使用二进制数字来表示某个事物是真是假,是存在还是不存在。例如,我可能会问 10 个人他们是否经历过偏头痛。如果他们的答案是: + +```r +# create variable containing responses to migraine question + +everHadMigraine <- c('Yes','No','Yes','No','No','No','Yes','No','No','No') +everHadMigraine +``` + +```r +## [1] "Yes" "No" "Yes" "No" "No" "No" "Yes" "No" "No" "No" +``` + +相反,我们可以使用==符号将这些值重新编码为真值,该符号是对相等性的测试,如果这两个值相等,则返回逻辑值“真”,否则返回“假”。 + +```r +# create truth values from everHadMigraine variable + +everHadMigraineTF <- everHadMigraine == 'Yes' +everHadMigraineTF +``` + +```r +## [1] TRUE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE +``` + +r 同等对待真值和二进制数: + +```r +# evaluate truth of a set of assertions + +# 1 is equal to TRUE - should return TRUE +TRUE == 1 +``` + +```r +## [1] TRUE +``` + +```r +# 0 is equal to FALSE - should return TRUE +FALSE == 0 +``` + +```r +## [1] TRUE +``` + +```r +# 0 is equal to true - should return FALSE +TRUE == 0 +``` + +```r +## [1] FALSE +``` + +我们还可以将真值列表显式地转换为整数: + +```r +# create integer values from truth values using as.integer() + +everHadMigraineBinary <- as.integer(everHadMigraineTF) +everHadMigraineBinary +``` + +```r +## [1] 1 0 1 0 0 0 1 0 0 0 +``` + +当我们谈到概率论时,我们会看到一种方法,在这种方法中,这种表示是非常有用的。 + +**整数**。整数是不含小数部分或小数部分的整数。我们在计算事物时最常遇到整数,但在心理测量中也经常遇到整数。例如,在我的介绍性调查中,我处理了一组关于统计学态度的问题(例如“统计学对我来说似乎很神秘”),在这些问题上,学生的回答是 1(“强烈反对”)到 7(“强烈同意”)。 + +**实数**。在统计学中,我们通常使用实数,实数有小数/十进制部分。例如,我们可以测量某人的体重,从整磅到微克,精确到任意水平。 + +## 2.2 测量尺度 + +所有变量必须至少具有两个不同的可能值(否则它们将是一个 _ 常量 _ 而不是一个变量),但变量的不同值可以以不同的方式相互关联,我们称之为 _ 测量尺度 _。变量的不同值有四种不同的方式。 + +* _identity_:变量的每个值都有唯一的含义。 + +* 【htg0】震级【htg1】:该变量的值反映了不同的震级,并且相互之间具有有序的关系,即有些值较大,有些值较小。 +* _ 等间隔 _:沿测量尺度的单位是相等的。例如,这意味着 1 和 2 之间的差值在大小上等于 19 和 20 之间的差值。 +* _ 绝对零点 _:刻度有一个真正有意义的零点。例如,对于许多物理量的测量,例如高度或重量,这是完全没有被测量的东西。 + +有四种不同的测量尺度,随着这些不同的方式,变量的值可能会有所不同。 + +_ 标称刻度 _。一个名义变量满足同一性的标准,这样每个变量的值代表不同的东西,但数字只是作为定性标签,如上所述。例如,我们可能会要求人们加入他们的政党,然后将其编码为数字:1=“共和党”、2=“民主党”、3=“自由主义者”等等。但是,不同的数字之间没有任何有序的关系。 + +_ 序数刻度 _。一个序数变量满足同一性和数量级的标准,这样就可以按数量级对值进行排序。例如,我们可能会要求患有慢性疼痛的人每天填写一份表格,用 1-7 个数字量表来评估他们的疼痛有多严重。请注意,虽然患者在报告 6 天时可能会感觉到更多的疼痛,而在报告 3 天时则感觉到更多的疼痛,但是说他们的疼痛是前者的两倍,后者的两倍,这是没有意义的;排序给了我们有关相对大小的信息,但不同的是数值之间的 CES 在量级上不一定相等。 + +_ 间隔刻度 _。区间标度具有序数标度的所有特征,但除此之外,测量标度上各单位之间的间隔可以视为相等。一个标准的例子是以摄氏度或法伦海特为单位测量的物理温度;10 度和 20 度之间的物理差异与 90 度和 100 度之间的物理差异相同,但每个刻度也可以取负值。 + +_ 比例标度 _。比例尺度变量具有上述四个特征:同一性、量值、等间隔和绝对零。比率比例变量和区间比例变量的区别在于比率比例变量具有真正的零点。比例尺度变量的例子包括物理高度和重量,以及以开尔文测量的温度。 + +# + +## 2.2.1 为什么测量尺度很重要? + +有两个重要的原因,我们必须注意一个变量的测量尺度。首先,尺度决定了我们可以应用于数据的数学运算类型(见表[2.2](#tab:MeasurementTypes))。只能比较名义变量是否相等;也就是说,对该变量的两个观测值是否具有相同的数值?将其他数学运算应用于一个名义变量是没有意义的,因为它们在名义变量中不是真正的数字,而是作为标签。对于序数变量,我们也可以测试一个值是否大于或小于另一个值,但我们不能做任何算术。区间变量和比率变量允许我们执行算术;对于区间变量,我们只能加或减数值,而对于比率变量,我们也可以乘和除数值。 + +Table 2.2 Different scales of measurement admit different types of numeric operations +| | 等于/不等于 | 大于/小于 | 加/减 | 乘/除 | +| --- | --- | --- | --- | --- | +| 名义 | 好啊 | | | | +| 依次的 | OK | OK | | | +| 间隔 | OK | OK | OK | | +| 比率 | OK | OK | OK | OK | + +这些约束也意味着我们可以对每种类型的变量计算某些类型的统计信息。只需计算不同值(例如最常见的值,即 _ 模式 _)的统计信息,就可以对任何变量类型进行计算。其他统计数据是基于值的排序或排序(如 _ 中位数 _,当所有值都按其大小排序时,中位数是中间值),这些统计数据要求值至少按顺序排列。最后,涉及到值相加的统计(如平均值或 _ 平均值 _)要求变量至少在区间尺度上。尽管如此,我们应该注意到,对于研究人员来说,计算只有序数的变量的平均值是很常见的(比如人格测试的反应),但这有时会有问题。 + +## 2.3 什么是良好的测量? + +在心理学等许多领域,我们所测量的不是物理特征,而是一个不可观测的理论概念,我们通常称之为 _ 结构 _。例如,假设我想测试一下您对上述四种不同测量尺度之间的区别有多了解。我可以给你一个弹出测试,问你几个关于这些概念的问题,并计算你有多少是正确的。这个测试可能是或者可能不是对你实际知识结构的一个很好的度量——例如,如果我用一种令人困惑的方式编写测试或者使用你不理解的语言,那么这个测试可能会建议你在真正的时候不理解这些概念。另一方面,如果我给你一个有着非常明显错误答案的多选测试,那么你可能在测试中表现得很好,即使你并不真正理解材料。 + +在没有一定误差的情况下,通常不可能测量结构。在上面的例子中,您可能知道答案,但您可能误读了问题并弄错了。在其他情况下,被测物本身存在误差,例如,当我们测量一个人在一个简单的反应时间测试中需要多长时间做出反应时,由于许多原因,从一个试验到另一个试验都会有所不同。我们通常希望我们的测量误差尽可能低。 + +有时有一个标准可以用来测试其他的测量,我们可以称之为“黄金标准”——例如,睡眠的测量可以用许多不同的设备(例如测量床上运动的设备)来完成,但它们通常被认为不如多导睡眠图的黄金标准(使用脑电波测量来量化一个人在睡眠的每个阶段所花费的时间)。通常金本位制的执行难度更大或成本更高,即使可能存在更大的误差,也会使用更便宜的方法。 + +当我们思考什么是一个好的度量时,我们通常会区分一个好度量的两个不同方面。 + +# + +## 2.3.1_ 可靠性 _ + +可靠性量化了我们测量结果的一致性。一种常见的可靠性形式被称为“测试-再测试可靠性”,它测量如果相同的测量进行两次,测量结果的一致性。例如,我可能会给你一份关于你今天对统计的态度的调查问卷,明天重复同样的调查问卷,并在两天内比较你的答案;我们希望它们彼此非常相似,除非在两次测试之间发生了一些应该改变了你对统计的看法(比如读这本书!). + +另一种评估可靠性的方法是在数据包括主观判断的情况下。例如,假设一个研究人员想确定一种治疗是否会改变自闭症儿童与其他儿童的互动程度,这是通过让专家观察儿童并对他们与其他儿童的互动进行评级来衡量的。在这种情况下,我们希望确保答案不依赖于评级机构——也就是说,我们希望有高 _ 的评级机构间可靠性 _。这可以通过让多个评级者执行评级来评估,然后比较他们的评级,以确保他们之间的一致性。 + +如果我们想将一个测量值与另一个测量值进行比较,可靠性是很重要的。两个不同测量值之间的关系不能比两个测量值之间的关系强(即其可靠性)。这意味着一个不可靠的度量永远不会与任何其他度量有很强的统计关系。因此,研究人员开发一种新的测量方法(如一项新的调查),通常会花很大的时间来测试它的可靠性。 + +![A figure demonstrating the distinction between reliability and validity, using shots at a bullseye. Reliability refers to the consistency of location of shots, and validity refers to the accuracy of the shots with respect to the center of the bullseye. ](img/file1.png) + +图 2.1 使用靶心射击,显示可靠性和有效性之间的区别的图。可靠性是指射击位置的一致性,有效性是指射击相对于靶心的准确性。 + +# + +## 2.3.2_ 有效性 _ + +可靠性很重要,但就其本身而言还不够:毕竟,我可以用一个数字对每个答案进行编码,从而在人格测试中创建一个高度可靠的衡量标准,不管这个人如何回答。我们希望我们的测量结果也是 _ 有效的 _——也就是说,我们希望确保我们实际测量的是我们认为我们正在测量的构造(图[2.1](#fig:ReliabilityValidity))。有许多不同类型的有效性被普遍讨论;我们将集中讨论其中的三种。 + +_ 人脸有效性 _。测量值在表面上有意义吗?如果我告诉你我要通过观察一个人的舌头的颜色来测量他的血压,你可能会认为这不是一个有效的测量方法。另一方面,使用血压袖带将具有面部有效性。这通常是我们深入到更复杂的有效性方面之前的第一个现实检查。 + +_ 构造有效性 _。测量是否以适当的方式与其他测量相关?这通常被细分为两个方面。_ 收敛有效性 _ 意味着度量应该与其他被认为反映相同构造的度量密切相关。假设我有兴趣通过问卷调查或面试来衡量一个人的外向程度。如果这两个不同的度量值彼此密切相关,则可以证明收敛有效性。另一方面,被认为反映不同结构的度量应该是不相关的,即 _ 发散效度 _。如果我的人格理论认为外向性和责任感是两个不同的结构,那么我也应该看到我对外向性的测量与责任感的测量是无关的。 + +_ 预测有效性 _。如果我们的测量结果确实有效,那么它们也应该是对其他结果的预测。例如,假设我们认为,情感寻求的心理特征(对新体验的渴望)与现实世界中的冒险有关。为了检验感觉寻求测量的预测有效性,我们将在一项不同的测量现实风险的调查中,测试测试分数对预测分数的影响。 + +## 2.4 阅读建议 + +* 【htg0】【htg1】心理测量理论导论及其在 R【htg2】【htg3】中的应用——免费在线心理测量教科书 \ No newline at end of file diff --git a/docs/2.x2.md b/docs/2.x2.md deleted file mode 100644 index 7b4209b52ebb3ea12fd987f24a2e129e5ea34599..0000000000000000000000000000000000000000 --- a/docs/2.x2.md +++ /dev/null @@ -1,185 +0,0 @@ -# 2 处理数据 - -## 2.1 什么是数据? - -关于数据的第一个重要点是数据 _ 是 _——意思是“数据”这个词是复数(尽管有些人在这一点上不同意我的观点)。你也可能想知道如何发音“data”——我说“day-tah”,但我认识许多说“dah-tah”的人,尽管如此,我仍然可以和他们保持朋友关系。现在如果我听到他们说“数据是”,那将是更大的问题… - -# - -## 2.1.1 定性数据 - -数据由 _ 变量 _ 组成,其中变量反映唯一的度量或数量。有些变量是 _ 定性的 _,这意味着它们描述的是质量而不是数字量。例如,在我的统计课程中,我通常会做一个介绍性的调查,既可以获取课堂上使用的数据,也可以了解更多关于学生的信息。我问的问题之一是“你最喜欢吃什么?”其中一些答案是:蓝莓、巧克力、玉米粉蒸肉、意大利面、披萨和芒果。这些数据本质上不是数字;我们可以为每个数据分配数字(1=蓝莓,2=巧克力等),但我们只会将数字用作标签,而不是实数;例如,在这种情况下,将数字相加是没有意义的。但是,我们通常会使用数字对定性数据进行编码,以使它们更易于使用,稍后您将看到。 - -# - -## 2.1.2 定量数据 - -在统计学中,我们更常用于 _ 定量 _ 数据,这意味着数据是数字的。例如,这里的表[2.1](#tab:WhyTakingClass)显示了我在入门课上问的另一个问题的结果,即“你为什么要上这门课?” - -Table 2.1 Counts of the prevalence of different responses to the question "Why are you taking this class?" -| 你为什么要上这门课? | 学生人数 | -| --- | --- | -| 满足学位计划要求 | 105 | -| 满足通识教育广度要求 | 32 | -| 不需要,但我对这个话题感兴趣 | 11 个 | -| 其他 | 4 | - -请注意,学生的回答是定性的,但我们通过计算每个回答的学生数得出了他们的定量总结。 - -## - -## 2.1.2.1 数字类型 - -我们在统计中处理的数字有几种不同的类型。理解这些差异很重要,部分原因是像 R 这样的编程语言经常区分它们。 - -**二进制数**。最简单的是二进制数——也就是零或一。我们经常使用二进制数字来表示某个事物是真是假,是存在还是不存在。例如,我可能会问 10 个人他们是否经历过偏头痛。如果他们的答案是: - -```r -# create variable containing responses to migraine question - -everHadMigraine <- c('Yes','No','Yes','No','No','No','Yes','No','No','No') -everHadMigraine -``` - -```r -## [1] "Yes" "No" "Yes" "No" "No" "No" "Yes" "No" "No" "No" -``` - -相反,我们可以使用==符号将这些值重新编码为真值,该符号是对相等性的测试,如果这两个值相等,则返回逻辑值“真”,否则返回“假”。 - -```r -# create truth values from everHadMigraine variable - -everHadMigraineTF <- everHadMigraine == 'Yes' -everHadMigraineTF -``` - -```r -## [1] TRUE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE -``` - -r 同等对待真值和二进制数: - -```r -# evaluate truth of a set of assertions - -# 1 is equal to TRUE - should return TRUE -TRUE == 1 -``` - -```r -## [1] TRUE -``` - -```r -# 0 is equal to FALSE - should return TRUE -FALSE == 0 -``` - -```r -## [1] TRUE -``` - -```r -# 0 is equal to true - should return FALSE -TRUE == 0 -``` - -```r -## [1] FALSE -``` - -我们还可以将真值列表显式地转换为整数: - -```r -# create integer values from truth values using as.integer() - -everHadMigraineBinary <- as.integer(everHadMigraineTF) -everHadMigraineBinary -``` - -```r -## [1] 1 0 1 0 0 0 1 0 0 0 -``` - -当我们谈到概率论时,我们会看到一种方法,在这种方法中,这种表示是非常有用的。 - -**整数**。整数是不含小数部分或小数部分的整数。我们在计算事物时最常遇到整数,但在心理测量中也经常遇到整数。例如,在我的介绍性调查中,我处理了一组关于统计学态度的问题(例如“统计学对我来说似乎很神秘”),在这些问题上,学生的回答是 1(“强烈反对”)到 7(“强烈同意”)。 - -**实数**。在统计学中,我们通常使用实数,实数有小数/十进制部分。例如,我们可以测量某人的体重,从整磅到微克,精确到任意水平。 - -## 2.2 测量尺度 - -所有变量必须至少具有两个不同的可能值(否则它们将是一个 _ 常量 _ 而不是一个变量),但变量的不同值可以以不同的方式相互关联,我们称之为 _ 测量尺度 _。变量的不同值有四种不同的方式。 - -* _identity_:变量的每个值都有唯一的含义。 - -* 【htg0】震级【htg1】:该变量的值反映了不同的震级,并且相互之间具有有序的关系,即有些值较大,有些值较小。 -* _ 等间隔 _:沿测量尺度的单位是相等的。例如,这意味着 1 和 2 之间的差值在大小上等于 19 和 20 之间的差值。 -* _ 绝对零点 _:刻度有一个真正有意义的零点。例如,对于许多物理量的测量,例如高度或重量,这是完全没有被测量的东西。 - -有四种不同的测量尺度,随着这些不同的方式,变量的值可能会有所不同。 - -_ 标称刻度 _。一个名义变量满足同一性的标准,这样每个变量的值代表不同的东西,但数字只是作为定性标签,如上所述。例如,我们可能会要求人们加入他们的政党,然后将其编码为数字:1=“共和党”、2=“民主党”、3=“自由主义者”等等。但是,不同的数字之间没有任何有序的关系。 - -_ 序数刻度 _。一个序数变量满足同一性和数量级的标准,这样就可以按数量级对值进行排序。例如,我们可能会要求患有慢性疼痛的人每天填写一份表格,用 1-7 个数字量表来评估他们的疼痛有多严重。请注意,虽然患者在报告 6 天时可能会感觉到更多的疼痛,而在报告 3 天时则感觉到更多的疼痛,但是说他们的疼痛是前者的两倍,后者的两倍,这是没有意义的;排序给了我们有关相对大小的信息,但不同的是数值之间的 CES 在量级上不一定相等。 - -_ 间隔刻度 _。区间标度具有序数标度的所有特征,但除此之外,测量标度上各单位之间的间隔可以视为相等。一个标准的例子是以摄氏度或法伦海特为单位测量的物理温度;10 度和 20 度之间的物理差异与 90 度和 100 度之间的物理差异相同,但每个刻度也可以取负值。 - -_ 比例标度 _。比例尺度变量具有上述四个特征:同一性、量值、等间隔和绝对零。比率比例变量和区间比例变量的区别在于比率比例变量具有真正的零点。比例尺度变量的例子包括物理高度和重量,以及以开尔文测量的温度。 - -# - -## 2.2.1 为什么测量尺度很重要? - -有两个重要的原因,我们必须注意一个变量的测量尺度。首先,尺度决定了我们可以应用于数据的数学运算类型(见表[2.2](#tab:MeasurementTypes))。只能比较名义变量是否相等;也就是说,对该变量的两个观测值是否具有相同的数值?将其他数学运算应用于一个名义变量是没有意义的,因为它们在名义变量中不是真正的数字,而是作为标签。对于序数变量,我们也可以测试一个值是否大于或小于另一个值,但我们不能做任何算术。区间变量和比率变量允许我们执行算术;对于区间变量,我们只能加或减数值,而对于比率变量,我们也可以乘和除数值。 - -Table 2.2 Different scales of measurement admit different types of numeric operations -| | 等于/不等于 | 大于/小于 | 加/减 | 乘/除 | -| --- | --- | --- | --- | --- | -| 名义 | 好啊 | | | | -| 依次的 | OK | OK | | | -| 间隔 | OK | OK | OK | | -| 比率 | OK | OK | OK | OK | - -这些约束也意味着我们可以对每种类型的变量计算某些类型的统计信息。只需计算不同值(例如最常见的值,即 _ 模式 _)的统计信息,就可以对任何变量类型进行计算。其他统计数据是基于值的排序或排序(如 _ 中位数 _,当所有值都按其大小排序时,中位数是中间值),这些统计数据要求值至少按顺序排列。最后,涉及到值相加的统计(如平均值或 _ 平均值 _)要求变量至少在区间尺度上。尽管如此,我们应该注意到,对于研究人员来说,计算只有序数的变量的平均值是很常见的(比如人格测试的反应),但这有时会有问题。 - -## 2.3 什么是良好的测量? - -在心理学等许多领域,我们所测量的不是物理特征,而是一个不可观测的理论概念,我们通常称之为 _ 结构 _。例如,假设我想测试一下您对上述四种不同测量尺度之间的区别有多了解。我可以给你一个弹出测试,问你几个关于这些概念的问题,并计算你有多少是正确的。这个测试可能是或者可能不是对你实际知识结构的一个很好的度量——例如,如果我用一种令人困惑的方式编写测试或者使用你不理解的语言,那么这个测试可能会建议你在真正的时候不理解这些概念。另一方面,如果我给你一个有着非常明显错误答案的多选测试,那么你可能在测试中表现得很好,即使你并不真正理解材料。 - -在没有一定误差的情况下,通常不可能测量结构。在上面的例子中,您可能知道答案,但您可能误读了问题并弄错了。在其他情况下,被测物本身存在误差,例如,当我们测量一个人在一个简单的反应时间测试中需要多长时间做出反应时,由于许多原因,从一个试验到另一个试验都会有所不同。我们通常希望我们的测量误差尽可能低。 - -有时有一个标准可以用来测试其他的测量,我们可以称之为“黄金标准”——例如,睡眠的测量可以用许多不同的设备(例如测量床上运动的设备)来完成,但它们通常被认为不如多导睡眠图的黄金标准(使用脑电波测量来量化一个人在睡眠的每个阶段所花费的时间)。通常金本位制的执行难度更大或成本更高,即使可能存在更大的误差,也会使用更便宜的方法。 - -当我们思考什么是一个好的度量时,我们通常会区分一个好度量的两个不同方面。 - -# - -## 2.3.1_ 可靠性 _ - -可靠性量化了我们测量结果的一致性。一种常见的可靠性形式被称为“测试-再测试可靠性”,它测量如果相同的测量进行两次,测量结果的一致性。例如,我可能会给你一份关于你今天对统计的态度的调查问卷,明天重复同样的调查问卷,并在两天内比较你的答案;我们希望它们彼此非常相似,除非在两次测试之间发生了一些应该改变了你对统计的看法(比如读这本书!). - -另一种评估可靠性的方法是在数据包括主观判断的情况下。例如,假设一个研究人员想确定一种治疗是否会改变自闭症儿童与其他儿童的互动程度,这是通过让专家观察儿童并对他们与其他儿童的互动进行评级来衡量的。在这种情况下,我们希望确保答案不依赖于评级机构——也就是说,我们希望有高 _ 的评级机构间可靠性 _。这可以通过让多个评级者执行评级来评估,然后比较他们的评级,以确保他们之间的一致性。 - -如果我们想将一个测量值与另一个测量值进行比较,可靠性是很重要的。两个不同测量值之间的关系不能比两个测量值之间的关系强(即其可靠性)。这意味着一个不可靠的度量永远不会与任何其他度量有很强的统计关系。因此,研究人员开发一种新的测量方法(如一项新的调查),通常会花很大的时间来测试它的可靠性。 - -![A figure demonstrating the distinction between reliability and validity, using shots at a bullseye. Reliability refers to the consistency of location of shots, and validity refers to the accuracy of the shots with respect to the center of the bullseye. ](img/file1.png) - -图 2.1 使用靶心射击,显示可靠性和有效性之间的区别的图。可靠性是指射击位置的一致性,有效性是指射击相对于靶心的准确性。 - -# - -## 2.3.2_ 有效性 _ - -可靠性很重要,但就其本身而言还不够:毕竟,我可以用一个数字对每个答案进行编码,从而在人格测试中创建一个高度可靠的衡量标准,不管这个人如何回答。我们希望我们的测量结果也是 _ 有效的 _——也就是说,我们希望确保我们实际测量的是我们认为我们正在测量的构造(图[2.1](#fig:ReliabilityValidity))。有许多不同类型的有效性被普遍讨论;我们将集中讨论其中的三种。 - -_ 人脸有效性 _。测量值在表面上有意义吗?如果我告诉你我要通过观察一个人的舌头的颜色来测量他的血压,你可能会认为这不是一个有效的测量方法。另一方面,使用血压袖带将具有面部有效性。这通常是我们深入到更复杂的有效性方面之前的第一个现实检查。 - -_ 构造有效性 _。测量是否以适当的方式与其他测量相关?这通常被细分为两个方面。_ 收敛有效性 _ 意味着度量应该与其他被认为反映相同构造的度量密切相关。假设我有兴趣通过问卷调查或面试来衡量一个人的外向程度。如果这两个不同的度量值彼此密切相关,则可以证明收敛有效性。另一方面,被认为反映不同结构的度量应该是不相关的,即 _ 发散效度 _。如果我的人格理论认为外向性和责任感是两个不同的结构,那么我也应该看到我对外向性的测量与责任感的测量是无关的。 - -_ 预测有效性 _。如果我们的测量结果确实有效,那么它们也应该是对其他结果的预测。例如,假设我们认为,情感寻求的心理特征(对新体验的渴望)与现实世界中的冒险有关。为了检验感觉寻求测量的预测有效性,我们将在一项不同的测量现实风险的调查中,测试测试分数对预测分数的影响。 - -## 2.4 阅读建议 - -* 【htg0】【htg1】心理测量理论导论及其在 R【htg2】【htg3】中的应用——免费在线心理测量教科书 \ No newline at end of file diff --git a/docs/3.md b/docs/3.md index 0f736c43fca4aa0d5f6338805a2279b025017715..35e8a7fbd735a07b1e02d7c90de3338d3ddfbe5c 100644 --- a/docs/3.md +++ b/docs/3.md @@ -1,3 +1,461 @@ # 3 概率 -概率论是处理机会和不确定性的数学分支。它是统计基础的重要组成部分,因为它为我们提供了描述不确定事件的数学工具。概率的研究部分是由于人们对机会游戏的理解感兴趣,如纸牌或骰子。这些游戏提供了许多统计概念的有用例子,因为当我们重复这些游戏时,不同结果的可能性(大部分)保持不变。然而,关于概率的含义有一些深层次的问题,我们在这里不讨论;如果您有兴趣进一步了解这个迷人的主题及其历史,请参阅结尾处的建议阅读资料。 \ No newline at end of file +概率论是处理机会和不确定性的数学分支。它是统计基础的重要组成部分,因为它为我们提供了描述不确定事件的数学工具。概率的研究部分是由于人们对机会游戏的理解感兴趣,如纸牌或骰子。这些游戏提供了许多统计概念的有用例子,因为当我们重复这些游戏时,不同结果的可能性(大部分)保持不变。然而,关于概率的含义有一些深层次的问题,我们在这里不讨论;如果您有兴趣进一步了解这个迷人的主题及其历史,请参阅结尾处的建议阅读资料。 + +## 3.1 什么是概率? + +非正式地,我们通常认为概率是一个描述某些事件发生可能性的数字,范围从零(不可能)到一(确定)。有时概率会用百分比表示,从 0 到 100 不等,正如天气预报预测今天有 20%的可能下雨一样。在每种情况下,这些数字表示特定事件的可能性。 + +为了将概率论形式化,我们首先需要定义一些术语: + +* 实验是产生或观察结果的任何活动。例如,掷硬币、掷 6 面骰子,或者尝试新的工作路线,看它是否比旧路线快。 +* **样本空间**是一个实验的可能结果集。对于硬币翻转,样本空间为 h,t,其中括号代表样本空间,h/t 代表头部/尾部。对于模具,样本空间为 1,2,3,4,5,6。对于工作所需的时间量,样本空间都是可能大于零的实数(因为它不能用负的时间到达某个地方,至少目前还不能)。 +* **事件**是示例空间的子集。在这里,我们将主要关注 _ 基本事件 _,这些事件恰好包含一个可能的结果,例如掷硬币时的头部、掷骰子时的 4 个骰子,或通过新路线回家的 21 分钟。 + +既然我们有了这些定义,我们就可以概括概率的形式特征,这是俄罗斯数学家安德烈·科尔莫戈罗夫首先定义的。如果![](img/c19b3077c17fe200131a79fb6c4ac2c2.jpg)是事件概率![](img/5143e6254d17445e6820bbb6e8b7da18.jpg): + +* 概率不能为负:![](img/555cbea505c8a6b43c304d5f2d4e645c.jpg) +![](img/4f98f32d21a04ea5213082846c7461bc.jpg) +* 样本空间中所有结果的总概率为 1。我们可以使用求和符号![](img/7b42d2833406d2db1d97024211e71755.jpg)来表示它: + +这被解释为“把所有的 n 个基本事件,我们从 1 到 n,加起来它们的概率。这些必须加为 1。“这意味着任何单个事件的概率不能大于 1:![](img/d08df198a58a4f2eebfd16844b3d0987.jpg) + +## 3.10 概率是什么意思? + +你可能会觉得,根据测试结果谈论一个人患癌症的几率有点奇怪;毕竟,这个人要么患了癌症,要么没有。历史上,概率有两种不同的解释方式。第一种解释(被称为 _ 频率主义者 _ 解释)用长期频率解释概率。例如,在硬币翻转的情况下,它将反映出大量翻转之后,头部在长期内的相对频率。虽然这种解释可能对像掷硬币一样可以重复多次的事件有意义,但对于只会发生一次的事件,如个人的生活或特定的总统选举,则没有意义;正如经济学家约翰·梅纳德·凯恩斯(John Maynard Keynes)著名地说的,“在从长远来看,我们都死定了。” + +可能性的另一种解释(称为 _ 贝叶斯 _ 解释)是对特定命题的一种信仰程度。如果我问你“到 2026 年美国重返月球的可能性有多大”,你可以根据你的知识和信仰来回答这个问题,即使没有相关的频率来计算频率概率。我们经常用一种方法来界定主观概率,那就是根据一个人愿意接受一个特定的赌博。例如,如果你认为美国在 2026 年登陆月球的概率是 0.1(即几率为 9:1),那么这意味着你应该愿意接受一场赌博,如果这一事件发生的话,它将以超过 9:1 的几率获得回报。 + +正如我们将看到的,概率的这两个不同定义与统计学家考虑检验统计假设的两种不同方式非常相关,我们将在后面的章节中遇到这两种方式。 + +## 3.11 阅读建议 + +* 酒鬼之行:随机性如何支配我们的生活 + +## 3.2 我们如何确定概率? + +既然我们知道了概率是什么,那么我们如何才能真正知道任何特定事件的概率是什么呢? + +# + +## 3.2.1 个人意见 + +假设我问你,如果伯尼·桑德斯获得民主党提名而不是希拉里·克林顿的话,他在 2016 年赢得美国总统大选的可能性有多大。这里的样本空间是桑德斯赢了,桑德斯输了,但我们实际上不能做实验来找到结果。然而,大多数了解选举的人都愿意对这一事件的可能性进行猜测。在许多情况下,个人知识和/或意见是我们确定事件发生概率的唯一指南,但这在科学上并不令人满意。 + +# + +## 3.2.2 经验频率 + +另一种确定事件发生概率的方法是多次进行实验,并计算每个事件发生的频率。根据不同结果的相对频率,我们可以计算出每个结果的概率。比如说,我们有兴趣知道旧金山下雨的可能性。首先,我们必须定义实验---假设我们将在 2017 的每一天查看国家气象服务数据(可以从 [HTTPS://www. NCDC.NOAAGOV/](https://www.ncdc.noaa.gov/)下载),并确定在旧金山市中心的气象站是否有雨。 + +```r +# load data on rain in San Francisco and compute probability +SFrain <- read_csv("data/SanFranciscoRain/1329219.csv") + +# create a new variable indicating whether it rained on each day +SFrain <- + SFrain %>% + mutate(rainToday = as.integer(PRCP > 0)) + +SFrain_summary <- + SFrain %>% + summarize( + nRainyDays = sum(rainToday), + nDaysMeasured = n(), + pRainInSF = nRainyDays / nDaysMeasured + ) + +pander(SFrain_summary) +``` + + +| 每天 | 标准测量值 | 普拉宁斯 | +| --- | --- | --- | +| 73 | 365 个 | 0.2 条 | + +根据这些数据,2017 年有 73 个雨天。为了计算旧金山的降雨概率,我们简单地将雨天数除以(365),给出 P(SF 的雨在 2017)=0.2。 + +我们怎么知道经验概率给了我们正确的数字?这个问题的答案来自于 _ 大数定律 _,它表明随着样本量的增加,经验概率将接近真实概率。我们可以通过模拟大量的硬币翻转来看到这一点,并查看我们对每次翻转后头部概率的估计。在后面的章节中,我们将花费更多的时间讨论模拟;现在,假设我们有一种计算方法来为每个硬币翻转生成随机结果。 + +![A demonstration of the law of large numbers. A coin was flipped 30,000 times, and after each flip the probability of heads was computed based on the number of heads and tail collected up to that point. It takes about 15,000 flips for the probability to settle at the true probability of 0.5.](img/file2.png) + +图 3.1 大数定律的演示。一枚硬币被翻转了 30000 次,每次翻转后,头部的概率是根据收集到的头部和尾部的数量来计算的。以 0.5 的真实概率结算的概率大约需要 15000 次翻转。 + +图[3.1](#fig:FlipSim)显示,随着样本数量(即硬币翻转试验)的增加,头部的估计概率收敛到 0.5 的真实值。但是,请注意,当样本量较小时,估计值可能与真实值相差甚远。在 2017 年佐治亚州美国参议院特别选举中,看到了一个现实世界的例子,这场选举让共和党人罗伊·摩尔与民主党人道格·琼斯相提并论。图[3.2](#fig:ElectionResults)显示了随着越来越多的选票被计算在内,当晚每个候选人所报告的选票的相对数量。晚上早些时候,投票数特别不稳定,从琼斯最初的领先优势到摩尔领先的很长一段时间,直到琼斯最终领先赢得比赛。 + +![Relative proportion of the vote in the Dec 12, 2017 special election for the US Senate seat in Georgia, as a function of the percentage of precincts reporting. These data were transcribed from https://www.ajc.com/news/national/alabama-senate-race-live-updates-roy-moore-doug-jones/KPRfkdaweoiXICW3FHjXqI/](img/file3.png) + +图 3.2 2017 年 12 月 12 日美国佐治亚州参议院席位特别选举的投票相对比例,与选区报告百分比的函数关系。这些数据摘自[https://www.ajc.com/news/national/alabama-senate-race-live-updates-roy-moore-doug-jones/kpfkdaweixicw3fhjxqi/](https://www.ajc.com/news/national/alabama-senate-race-live-updates-roy-moore-doug-jones/KPRfkdaweoiXICW3FHjXqI/) + +这两个例子表明,虽然大样本最终会收敛于真实概率,但小样本的结果可能会相差很远。不幸的是,许多人忘记了这一点,并曲解了小样本的结果。心理学家丹尼·卡尼曼和阿莫斯·特沃斯基(Danny Kahneman and Amos Tversky)称之为“小数字定律”(HTG0),他们发现人们(甚至是受过训练的研究人员)的行为通常就好像大数字定律甚至适用于小样本一样,对小数据集的结果给予了过多的信任。.在整个过程中,我们将看到一些例子,说明在小样本的基础上生成统计结果会有多不稳定。 + +# + +## 3.2.3 经典概率 + +我们中的任何一个人都不太可能投过几万次硬币,但我们仍然愿意相信,倒头的概率是 0.5。这反映了另一种计算概率的方法的使用,我们称之为 _ 经典概率 _。在这种方法中,我们直接根据我们对形势的了解来计算概率。 + +经典概率源于对骰子和纸牌等机会游戏的研究。一个著名的例子来自一个法国赌徒遇到的一个问题,这个赌徒的名字是“chevalier de m_r_”。德玛 _r_ 玩了两种不同的骰子游戏:第一种是在六面骰子的四个骰子上赌至少一个六的机会,第二种是在两个骰子的 24 个骰子上赌至少一个六的机会。他希望在这两次赌博中都能赢,但他发现,尽管他在第一次赌博中平均赢了钱,但在第二次赌博中却多次输了钱。为了理解这一点,他求助于他的朋友,数学家布莱斯·帕斯卡,他现在被公认为概率论的创始人之一。 + +我们如何用概率论来理解这个问题?在经典概率论中,我们首先假设样本空间中的所有基本事件都同样可能发生;也就是说,当您滚动一个骰子时,所有可能的结果(1,2,3,4,5,6)都同样可能发生。(不允许加载骰子!)考虑到这一点,我们可以将任何单个结果的概率计算为: + +![](img/95e409ff1b376cb029cc2ea487c0de77.jpg) + +对于六面模具,每个单独结果的概率为 1/6。 + +这很好,但是 de m_r_ 对更复杂的事件感兴趣,比如多个骰子掷骰子时发生的事情。我们如何计算复杂事件(单个事件的联合)的概率,比如在第一个 _ 或 _ 中滚动一个事件或第二个事件?De M_r_ 认为(错误地,我们将在下面看到),他可以简单地将单个事件的概率相加,以计算组合事件的概率,这意味着在第一卷或第二卷上滚动一个事件的概率将计算如下: + +![](img/bcbc006e5ad8ea01c9cd991151fc6685.jpg) + +De M_r_ 基于此推断,四卷中至少六卷的概率是每个单卷的概率之和:![](img/da71c981c0c2a2d3826a404b5c3d26e2.jpg)。同样地,他推断,因为掷骰子时两个 6 的概率是 1/36,那么两个骰子的 24 卷骰子中至少一个 6 的概率是![](img/a6c683fede93757044be9205d9827e9d.jpg)。然而,尽管他总是在第一次下注中赢了钱,但在第二次下注中却输了钱。什么给予? + +为了理解 de m_r_ 的误差,我们需要引入概率论的一些规则。第一个是减法规则(htg0),即: + +![](img/7c5ff5ec992fd140f40694ffe951c49b.jpg) + +其中![](img/d8ac0924e8f1d43d7c6f957fb99f16f1.jpg)表示“非 a”。这个规则直接从我们上面讨论的公理中推导出来;因为 a 和![](img/d8ac0924e8f1d43d7c6f957fb99f16f1.jpg)是唯一可能的结果,所以它们的总概率必须加为 1。例如,如果在一次投掷中滚动一个物体的概率是![](img/2a4ca4061c264ca4697c0f4dc502a667.jpg),那么滚动除一个物体以外的任何物体的概率是![](img/74fd2a08ed4fd074168468efb99ab03a.jpg)。 + +第二条规则告诉我们如何计算联合事件的概率——也就是说,两个事件同时发生的概率。这个版本的规则告诉我们,在特殊情况下,当两个事件彼此独立时,如何计算这个量;我们稍后将确切地了解 _ 独立性 _ 的概念意味着什么,但现在我们可以想当然地认为这两个掷模是不独立的。ndent 事件。 + +![](img/bc104146831670ea28c529ac67c64009.jpg) + +因此,向两个辊中的每一辊投掷六个辊的概率是![](img/781e1bff976b78c3695802c1faa6f8ad.jpg)。 + +第三条规则告诉我们如何将概率相加——这里我们看到了 de m_r_ 错误的来源。加法规则告诉我们: + +![](img/1f2e4d778effc506dc13daace0ce132a.jpg) + +也就是说,A 或 B 发生的概率是通过将单个概率相加,然后减去两者同时发生的可能性来确定的。在某种意义上,这会阻止我们将这些实例计数两次。假设我们想找出在两个投掷中的任何一个上滚动 6 的概率。根据我们的规则: + +![](img/892769b632eb5c613f1169dfe81a565a.jpg)![](img/8746db7c69c50dd130ae037340d94252.jpg)![Each cell in this matrix represents one outcome of two throws of a die, with the columns representing the first throw and the rows representing the second throw. Cells shown in light blue represent the cells with a one in either the first or second throw; the rest are shown in dark blue.](img/file4.png) + +图 3.3 这个矩阵中的每个单元格表示一个 die 的两次 throw 的一个结果,其中列表示第一次 throw,行表示第二次 throw。浅蓝色显示的单元格表示第一次或第二次投掷中有一个单元格的单元格;其余的单元格显示为深蓝色。 + +让我们使用一个图形化的描述来获得这个规则的不同视图。图[3.3](#fig:ThrowMatrix)显示了一个表示所有可能抛出的矩阵,并突出显示了在第一次或第二次抛出中涉及一个抛出的单元格。如果你用浅蓝色数数这些细胞,你会发现有 11 个这样的细胞。这说明了为什么加法规则给出了与 de m_r_ 不同的答案;如果我们像他那样简单地把两次掷骰的概率相加,那么我们将对两次掷骰都计算(1,1),而实际上只计算一次。 + +# + +## 3.2.4 解决 de m_r_ 的问题 + +布莱斯·帕斯卡利用概率法则提出了一个解决德玛·R·_ 问题的方法。首先,他意识到,从一个组合中计算出至少一个事件的概率是很困难的,而计算出某个事件在多个事件中不发生的概率相对来说比较容易——这只是单个事件概率的乘积。因此,他不是计算四卷中至少六卷的概率,而是计算所有卷中没有混乱的概率: + +![](img/4275552aeb5f9f21d1301d414adb1fb3.jpg) + +然后,他利用四卷纸中无六个的概率是四卷纸中至少六个六个的补数(因此必须求和为一),并使用减法规则计算利息概率: + +![](img/a3678e8ff457f54d80e648c09ae0371d.jpg) + +德玛 __ 赌他会投至少六分之一的骰子的概率大于 0.5,这解释了德玛 ____ 为什么在这个赌注上平均赚钱。 + +但是,德姆雷尔的第二个赌注呢?帕斯卡使用了同样的技巧: + +![](img/d936c28e10e1a1bc69e4c816ec96bc11.jpg)![](img/b6ebca7c62fba5e97cab41a2627210b2.jpg) + +这一结果的概率略低于 0.5,这说明了为什么在这场赌博中,de m_r_ 平均赔钱。 + +## 3.3 概率分布 + +我们通常希望能够量化实验中任何可能值的概率。例如,在 2018 年 1 月 20 日,篮球运动员斯蒂芬·科里在与休斯顿火箭队的比赛中 4 次罚球中只有 2 次命中。我们知道库里在整个赛季的罚球命中率是 0.91,所以他在一场比赛中只命中 50%的罚球似乎是不太可能的,但这到底有多不可能呢?我们可以使用理论概率分布来确定这一点;在本课程中,我们将遇到许多这样的概率分布,每个概率分布都适合描述不同类型的数据。在这种情况下,我们使用 _ 二项式 _ 分布,它提供了一种方法来计算在给定一些已知的成功概率的情况下,许多“伯努利试验”(即,成功或失败的试验,两者之间没有任何结果)中一些成功的概率。每次审判。此分布定义为: + +![](img/6683d37792dc1e56e56c6099b321ad83.jpg) + +这是指成功概率为 p 时 n 次试验中 k 次成功的概率。您可能不熟悉![](img/9ed5422e7bd57da013ac5ba0daaa03a3.jpg),这被称为 _ 二项式系数 _。二项式系数也被称为“n-choose-k”,因为它描述了从 n 个项目中选择 k 个项目的不同方法的数量。二项式系数计算如下: + +![](img/bb538274ffbc9778bd28b556e9b8aff6.jpg) + +解释点在哪里!!)指数字的 _ 阶乘 _: + +![](img/f51d0fc8f546942bd6c2d7367b14cab1.jpg) + +以斯蒂芬·库里的罚球为例: + +![](img/38dc510f295ceb4a1b3e67f0f4c0d387.jpg) + +这表明,考虑到库里的总罚球率,他不太可能在 4 次罚球中只命中 2 次。这只是为了表明不太可能的事情实际上发生在现实世界中。 + +# + +## 3.3.1 累积概率分布 + +通常我们不仅想知道某个特定值的可能性有多大,而且想知道找到一个和某个特定值一样极端或更极端的值的可能性有多大。为了回答这个问题,我们可以使用 _ 累积 _ 概率分布;而标准概率分布告诉我们某个特定值的概率,而累积分布告诉我们一个值比它大或大(或小或小)的概率。Me 特定值。 + +在罚球的例子中,我们可能想知道:如果斯蒂芬·库里的罚球概率为 0.91,那么他在四个罚球中命中 2 个(htg0)或更少(htg1)的概率是多少。为了确定这一点,我们可以简单地使用二项式概率方程并插入 k 的所有可能值: + +![](img/f90534da8e5ce69cefbbd9ea90158a03.jpg) + +在许多情况下,可能的结果数量对于我们来说太大,无法通过列举所有可能的值来计算累积概率;幸运的是,它可以直接计算。对于二项式,我们可以使用`pbinom()`函数在 r 中执行此操作: + +```r +# compute cumulative probability distribution for Curry's free throws + +tibble( + numSuccesses = seq(0, 4) +) %>% + mutate( + probability = pbinom(numSuccesses, size = 4, prob = 0.91) + ) %>% + pander() +``` + + +| 无数次成功 | 可能性 | +| --- | --- | +| 0 | 0 | +| 1 个 | 0.003 个 | +| 二 | 0.043 个 | +| 三 | 0.314 个 | +| 4 | 1 | + +由此我们可以看出咖喱在 4 次尝试中 2 次或更少的罚球机会是 0.043。 + +## 3.4 条件概率 + +到目前为止,我们只局限于简单的概率——即单个事件或事件组合的概率。然而,我们通常希望确定某些事件发生的概率,因为已经发生了一些其他事件,这些事件被称为 _ 条件概率 _。 + +让我们以 2016 年美国总统大选为例。我们可以用两个简单的概率来描述选民。首先,我们知道美国选民与共和党有关联的可能性:![](img/d6680eda24388114adc889ffab670301.jpg)。我们也知道选民投票支持唐纳德·特朗普的可能性。但是,假设我们想知道以下情况:一个人投给唐纳德·特朗普(Donald Trump)的票的概率是多少,因为他们是共和党人? + +要计算给定 b 的条件概率(我们写为![](img/24f22119f3e28693fc84dea1ef25fb4f.jpg),“a 的概率,给定 b”),我们需要知道 _ 联合概率 _(即概率 a 和 b)以及 b 的总体概率: + +![](img/69e666309337d791dcdc76d4ad4752b1.jpg) + +也就是说,我们想知道两件事都是真的概率,前提是被制约的一件事是真的。 + +![A graphical depiction of conditional probability, showing how the conditional probability limits our analysis to a subset of the data.](img/file5.png) + +图 3.4 条件概率的图形描述,显示了条件概率如何限制我们对数据子集的分析。 + +从图形的角度考虑这一点很有用。图[3.4](#fig:conditionalProbability)显示了一个流程图,描绘了全体选民如何分解为共和党和民主党,以及条件概率(对政党的条件)如何根据他们的投票进一步分解每一个政党的成员。 + +## 3.5 根据数据计算条件概率 + +对于本课程中的许多例子,我们将使用从国家健康和营养检查调查(NHANES)获得的数据。NHANES 是美国疾病控制中心组织的一项正在进行的大型研究,旨在全面了解美国成人和儿童的健康和营养状况。每年,这项调查都会通过访谈和身体和医学测试,对美国大约 5000 人的样本进行调查。nhanes 数据作为一个包包含在 r 中,使其易于访问和使用。它还为我们提供了一个大型的、现实的数据集,作为许多不同统计工具的示例。 + +假设我们对以下问题很感兴趣:考虑到某人身体不活跃,他们患糖尿病的可能性有多大?--这就是![](img/49b313eeffd936da193774795c88ae98.jpg)。nhanes 记录了两个变量,解决了这个问题的两个部分。第一个(`Diabetes`)询问患者是否被告知患有糖尿病,第二个(`PhysActive`)记录患者是否从事至少中等强度的运动、健身或娱乐活动。我们先计算一下简单的概率。 + +```r +# Summarize NHANES data for diabetes and physical activity + +# drop duplicated IDs within the NHANES dataset +NHANES_diabetes_activity <- + NHANES %>% + distinct(ID, .keep_all = TRUE) %>% + drop_na(PhysActive, Diabetes) + +pander('Summary data for diabetes') +``` + +糖尿病汇总数据 + +```r +NHANES_diabetes_activity %>% + count(Diabetes) %>% + mutate( + prob = n / sum(n) + ) %>% + pander() +``` + + +| 糖尿病 | N 号 | 问题 | +| --- | --- | --- | +| 不 | 4893 个 | 0.899 个 | +| 是的 | 550 个 | 0.101 个 | + +```r +pander('Summary data for physical activity') +``` + +体育活动汇总数据 + +```r +NHANES_diabetes_activity %>% + count(PhysActive) %>% + mutate( + prob = n / sum(n) + ) %>% + pander() +``` + + +| 物理激活 | n | prob | +| --- | --- | --- | +| No | 2472 个 | 0.454 个 | +| Yes | 2971 年 | 0.546 个 | + +这表明 nhanes 数据集中的某个人患糖尿病的概率是 0.101,而某个人不活跃的概率是 0.454。 + +为了计算![](img/49b313eeffd936da193774795c88ae98.jpg),我们还需要知道糖尿病 _ 和 _ 不活动的联合概率,除了以下两种情况的简单概率: + +```r +# compute joint probabilities for diabetes and physical activity + +NHANES_diabetes_stats_by_activity <- + NHANES_diabetes_activity %>% + count(Diabetes, PhysActive) %>% + mutate( + prob = n / sum(n) + ) + +pander(NHANES_diabetes_stats_by_activity) +``` + + +| Diabetes | PhysActive | n | prob | +| --- | --- | --- | --- | +| No | No | 2123 个 | 0.39 分 | +| No | Yes | 2770 个 | 0.509 个 | +| Yes | No | 349 个 | 0.064 个 | +| Yes | Yes | 201 年 | 0.037 个 | + +基于这些联合概率,我们可以计算![](img/49b313eeffd936da193774795c88ae98.jpg): + +```r +# compute conditional probability p(diabetes|inactive) + +P_inactive <- + NHANES_diabetes_activity %>% + summarise( + mean(PhysActive == "No") + ) %>% + pull() + +P_diabetes_and_inactive <- + NHANES_diabetes_stats_by_activity %>% + dplyr::filter(Diabetes == "Yes", PhysActive == "No") %>% + pull(prob) + +P_diabetes_given_inactive <- + P_diabetes_and_inactive / P_inactive + +P_diabetes_given_inactive +``` + +```r +## [1] 0.1411812 +``` + +该块中的第一行代码通过测试每个独立的 physactive 变量是否等于“no”来计算![](img/1f17fd694a3be72e2afad017324c7c69.jpg)。这个技巧是有效的,因为 r 将真/假值分别视为 1/0;因此,如果我们想知道某个事件的可能性,我们可以生成一个布尔变量来测试该事件,然后简单地取该变量的平均值。然后我们用这个值来计算条件概率,我们发现一个人患糖尿病的概率是 0.141。 + +## 3.6 独立性 + +“独立”一词在统计学中有着非常具体的含义,这与该词的常用用法有些不同。两个变量之间的统计独立性意味着知道一个变量的值并不能告诉我们关于另一个变量的值。这可以表示为: + +![](img/78da5e67dcc3011e38046fcdbc4b98ad.jpg) + +也就是说,给定某个 b 值的概率与 a 的总体概率相同。这样看,我们看到世界上许多我们称之为“独立”的情况实际上并不是统计上独立的。例如,目前有一个由加利福尼亚州公民组成的小组宣布成立一个新的独立州杰斐逊,该州将包括加利福尼亚州北部和俄勒冈州的一些县。如果发生这种情况,那么当前加利福尼亚州居民现在居住在杰斐逊州的概率将是![](img/a580a173e7dba283e0e77c3b3b96bbaa.jpg),而他们仍然是加利福尼亚州居民的概率将是![](img/dd69f4593c37ae11cc30bc339330123b.jpg)。新的国家在政治上可能是独立的,但他们在统计上不会是独立的,因为(HTG4)!也就是说,虽然公共语言中的独立性通常指的是排他的集合,但是统计独立性指的是这样一种情况,即人们不能从另一个变量的值中预测关于一个变量的任何东西。例如,知道一个人的头发颜色不太可能告诉你他们喜欢巧克力还是草莓冰淇淋。 + +让我们来看另一个例子,使用 nhanes 数据:身体健康和心理健康是相互独立的吗?NHANES 包括两个相关问题:【htg0】physactive【htg1】,询问个人是否有体力活动;以及【htg2】daysmenthlthbad【htg3】,询问个人在过去 30 天中有多少天的精神健康状况不佳。我们将定义一个新的变量,称为“不良心理健康”,即在上个月有超过 7 天的不良心理健康,然后通过询问简单的不良心理健康概率是否与不良心理健康的条件概率不同来确定它们是否独立。即使身体很活跃。 + +```r +# compute probabilities for mental health and physical activity +NHANES_adult <- + NHANES %>% + dplyr::filter( + Age >= 18, + !is.na(PhysActive), + !is.na(DaysMentHlthBad) + ) %>% + mutate(badMentalHealth = DaysMentHlthBad > 7) + +NHANES_MentalHealth_summary <- + NHANES_adult %>% + summarize(badMentalHealth = mean(badMentalHealth)) + +pander(NHANES_MentalHealth_summary) +``` + + +| 心理健康 | +| --- | +| 0.164 个 | + +```r +NHANES_MentalHealth_by_PhysActive <- + NHANES_adult %>% + group_by(PhysActive) %>% + summarize(badMentalHealth = mean(badMentalHealth)) + +pander(NHANES_MentalHealth_by_PhysActive) +``` + + +| 物理激活 | badMentalHealth | +| --- | --- | +| 不 | 0.2 条 | +| 是的 | 0.132 个 | + +由此我们可以看出![](img/d59d2396e8e39871603921abbcf5e286.jpg)是 0.1640567,而![](img/6809316d601f4f790ba83cb237878ecb.jpg)是 0.1320808。因此,条件概率似乎比总概率小一些,这表明它们不是独立的,尽管我们不能通过观察数字来确定。在课程的后面,我们将遇到一些工具,这些工具将使我们更直接地量化两个变量是否独立。 + +## 3.7 逆转条件概率:贝叶斯规则 + +在许多情况下,我们知道![](img/24f22119f3e28693fc84dea1ef25fb4f.jpg),但我们真的想知道![](img/04e4300663edc1c8ba9ee7619d492ff0.jpg)。这通常发生在医学筛查中,我们知道(htg2),但我们想知道的是(htg3)。例如,一些医生建议 50 岁以上的男性接受前列腺特异性抗原(PSA)检测,以筛查可能的前列腺癌。在试验被批准用于医疗实践之前,制造商需要测试试验性能的两个方面。首先,他们需要展示(htg4)是如何敏感的(htg5),也就是说,当疾病出现时,它有多大可能找到它。他们还需要展示 _ 的特异性 _ 是如何的:也就是说,当没有疾病存在时,它有多可能产生阴性结果![](img/11a24376d41fe831e2b1a75ac35a795c.jpg)。对于变压吸附试验,我们知道敏感性约为 80%,特异性约为 70%。然而,这些并不能回答医生想要回答的问题:如果检测结果呈阳性,他们患癌症的可能性有多大?这要求我们颠倒定义灵敏度的条件概率:而不是我们想要知道的![](img/335536b8369d59f82cbf5856cbfa3fad.jpg)。 + +为了逆转条件概率,我们可以使用 _ 贝叶斯规则 _: + +![](img/a108a589f3ef6bc25721628a8017fda6.jpg) + +根据本章前面所学的概率规则,贝叶斯规则相当容易推导。首先,记住计算条件概率的规则: + +![](img/69e666309337d791dcdc76d4ad4752b1.jpg) + +我们可以重新排列,得到用条件计算联合概率的公式: + +![](img/c279a95d3c89df0b5ec444ff437571c3.jpg) + +利用这一点,我们可以计算反概率: + +![](img/86e5a13c055b54d6a6910677470b88b4.jpg) + +如果我们只有两个结果,我们可以用更清晰的方式表达,使用和规则重新定义![](img/b029cb77c2d095be990d28206f5331fb.jpg): + +![](img/8f21133de288eed7ed24804b9b561686.jpg) + +利用这个,我们可以重新定义贝叶斯规则: + +![](img/b94584013098374a0ab47488f17113bf.jpg) + +我们可以将相关的数字插入到这个方程中,以确定一个 PSA 结果为阳性的个体确实患有癌症的可能性——但要注意,为了做到这一点,我们还需要知道这个人患癌症的总概率,我们通常将其称为 _ 基 r。吃了 _。让我们以一个 60 岁的男人为例,他在未来 10 年中患前列腺癌的概率是![](img/f3a4a8ba6e1ea77eb2e2ce3f632393f3.jpg)。利用我们上面概述的敏感性和特异性值,我们可以通过阳性测试来计算患者患癌症的可能性: + +![](img/e244f05680b0d348b92cfc43d72cebb3.jpg)![](img/b30dad3c92a0b9d823ada3ca716d2e8e.jpg) + +那太小了——你觉得奇怪吗?许多人这样做,事实上,有大量的心理学文献表明,人们在判断时系统地忽视了 _ 基本比率 _(即总体患病率)。 + +## 3.8 数据学习 + +另一种看待 Bayes 法则的方法是根据数据更新我们的信仰——也就是说,利用数据了解世界。让我们再看一下贝叶斯法则: + +![](img/643f8315b1aea5ac8d51b0398b8bdf01.jpg) + +Bayes 规则的不同部分有特定的名称,这与它们在使用 Bayes 规则更新我们信仰中的作用有关。我们首先对 b(![](img/df4fe93523fb241ffac9274788373abd.jpg))的概率进行初步猜测,我们称之为 _ 先验 _ 概率。在变压吸附的例子中,我们使用了之前的基本速率,因为在我们知道测试结果之前这是我们最好的猜测。然后我们收集一些数据,在我们的示例中是测试结果。数据 A 与结果 B 的一致程度由![](img/24f22119f3e28693fc84dea1ef25fb4f.jpg)给出,我们称之为 _ 可能性 _。你可以把这看作是数据的可能性,考虑到特定的假设正在被检验。在我们的例子中,被测试的假设是个体是否患有癌症,可能性是基于我们对测试特殊性的了解。分母(![](img/b029cb77c2d095be990d28206f5331fb.jpg))被称为 _ 边际似然 _,因为它表示数据的总体似然性,在 a 的所有可能值(在我们的示例中是正的和负的测试结果)中取平均值。左边的结果(![](img/04e4300663edc1c8ba9ee7619d492ff0.jpg))被称为 _ 后面的 _——因为它是计算的后端。 + +有另一种方法来编写贝叶斯规则,使这一点更加清晰: + +![](img/00898e5a9153344b32d0f92370330484.jpg) + +左边的部分(![](img/93531d7b720068120e0de15fe39bdc50.jpg))告诉我们,相对于数据的总体(边际)可能性,A 被赋予的可能性有多大,或者更少;右边的部分(![](img/df4fe93523fb241ffac9274788373abd.jpg))告诉我们,我们认为 B(在我们了解数据之前)的可能性有多大。这就更清楚了,贝叶斯定理的作用是根据数据比整体更可能被赋予 b 的程度来更新我们的先验知识。 + +## 3.9 优势比 + +![](img/f5e7f7ff9510714766c40c5104bc5095.jpg) + +最后一节的结果显示,基于阳性的 PSA 测试结果,个体患癌症的可能性仍然相当低,尽管它比我们知道测试结果之前大了两倍多。我们通常希望更直接地量化概率之间的关系,我们可以将它们转换为 _ 概率 _,它表示发生或不发生事件的相对可能性: + +在我们的 PSA 例子中,患癌症的几率(假设阳性测试)是: + +![](img/da27ec811744735eaaffd9becb99fe83.jpg) + +这告诉我们,即使测试呈阳性,患癌症的几率也相当低。相比之下,在一次掷骰子中掷 6 的几率是: + +![](img/6c620c7b5d0342b7549c747042757d2a.jpg) + +另一方面,这也是许多医学研究人员越来越担心在相对不常见的情况下使用广泛的筛查测试的原因;大多数阳性结果将被证明是假阳性。 + +我们也可以通过计算所谓的 _ 比值比 _ 来比较不同的概率,这正是它听起来的样子。例如,假设我们想知道阳性测试会增加患者患癌症的几率。我们可以首先计算 _ 先验概率 _——也就是说,在我们知道这个人做了阳性测试之前的概率。这些是使用基本利率计算的: + +![](img/98fbaf2155933cc390bab248593502c3.jpg) + +然后,我们可以将其与后验概率进行比较,后验概率通过后验概率计算得出: + +![](img/f89093fbc7b2769ca9937c41bff7e47b.jpg) + +这告诉我们,鉴于阳性测试结果,患癌症的几率增加了 2.62。 \ No newline at end of file diff --git a/docs/3.x2.md b/docs/3.x2.md deleted file mode 100644 index 35e8a7fbd735a07b1e02d7c90de3338d3ddfbe5c..0000000000000000000000000000000000000000 --- a/docs/3.x2.md +++ /dev/null @@ -1,461 +0,0 @@ -# 3 概率 - -概率论是处理机会和不确定性的数学分支。它是统计基础的重要组成部分,因为它为我们提供了描述不确定事件的数学工具。概率的研究部分是由于人们对机会游戏的理解感兴趣,如纸牌或骰子。这些游戏提供了许多统计概念的有用例子,因为当我们重复这些游戏时,不同结果的可能性(大部分)保持不变。然而,关于概率的含义有一些深层次的问题,我们在这里不讨论;如果您有兴趣进一步了解这个迷人的主题及其历史,请参阅结尾处的建议阅读资料。 - -## 3.1 什么是概率? - -非正式地,我们通常认为概率是一个描述某些事件发生可能性的数字,范围从零(不可能)到一(确定)。有时概率会用百分比表示,从 0 到 100 不等,正如天气预报预测今天有 20%的可能下雨一样。在每种情况下,这些数字表示特定事件的可能性。 - -为了将概率论形式化,我们首先需要定义一些术语: - -* 实验是产生或观察结果的任何活动。例如,掷硬币、掷 6 面骰子,或者尝试新的工作路线,看它是否比旧路线快。 -* **样本空间**是一个实验的可能结果集。对于硬币翻转,样本空间为 h,t,其中括号代表样本空间,h/t 代表头部/尾部。对于模具,样本空间为 1,2,3,4,5,6。对于工作所需的时间量,样本空间都是可能大于零的实数(因为它不能用负的时间到达某个地方,至少目前还不能)。 -* **事件**是示例空间的子集。在这里,我们将主要关注 _ 基本事件 _,这些事件恰好包含一个可能的结果,例如掷硬币时的头部、掷骰子时的 4 个骰子,或通过新路线回家的 21 分钟。 - -既然我们有了这些定义,我们就可以概括概率的形式特征,这是俄罗斯数学家安德烈·科尔莫戈罗夫首先定义的。如果![](img/c19b3077c17fe200131a79fb6c4ac2c2.jpg)是事件概率![](img/5143e6254d17445e6820bbb6e8b7da18.jpg): - -* 概率不能为负:![](img/555cbea505c8a6b43c304d5f2d4e645c.jpg) -![](img/4f98f32d21a04ea5213082846c7461bc.jpg) -* 样本空间中所有结果的总概率为 1。我们可以使用求和符号![](img/7b42d2833406d2db1d97024211e71755.jpg)来表示它: - -这被解释为“把所有的 n 个基本事件,我们从 1 到 n,加起来它们的概率。这些必须加为 1。“这意味着任何单个事件的概率不能大于 1:![](img/d08df198a58a4f2eebfd16844b3d0987.jpg) - -## 3.10 概率是什么意思? - -你可能会觉得,根据测试结果谈论一个人患癌症的几率有点奇怪;毕竟,这个人要么患了癌症,要么没有。历史上,概率有两种不同的解释方式。第一种解释(被称为 _ 频率主义者 _ 解释)用长期频率解释概率。例如,在硬币翻转的情况下,它将反映出大量翻转之后,头部在长期内的相对频率。虽然这种解释可能对像掷硬币一样可以重复多次的事件有意义,但对于只会发生一次的事件,如个人的生活或特定的总统选举,则没有意义;正如经济学家约翰·梅纳德·凯恩斯(John Maynard Keynes)著名地说的,“在从长远来看,我们都死定了。” - -可能性的另一种解释(称为 _ 贝叶斯 _ 解释)是对特定命题的一种信仰程度。如果我问你“到 2026 年美国重返月球的可能性有多大”,你可以根据你的知识和信仰来回答这个问题,即使没有相关的频率来计算频率概率。我们经常用一种方法来界定主观概率,那就是根据一个人愿意接受一个特定的赌博。例如,如果你认为美国在 2026 年登陆月球的概率是 0.1(即几率为 9:1),那么这意味着你应该愿意接受一场赌博,如果这一事件发生的话,它将以超过 9:1 的几率获得回报。 - -正如我们将看到的,概率的这两个不同定义与统计学家考虑检验统计假设的两种不同方式非常相关,我们将在后面的章节中遇到这两种方式。 - -## 3.11 阅读建议 - -* 酒鬼之行:随机性如何支配我们的生活 - -## 3.2 我们如何确定概率? - -既然我们知道了概率是什么,那么我们如何才能真正知道任何特定事件的概率是什么呢? - -# - -## 3.2.1 个人意见 - -假设我问你,如果伯尼·桑德斯获得民主党提名而不是希拉里·克林顿的话,他在 2016 年赢得美国总统大选的可能性有多大。这里的样本空间是桑德斯赢了,桑德斯输了,但我们实际上不能做实验来找到结果。然而,大多数了解选举的人都愿意对这一事件的可能性进行猜测。在许多情况下,个人知识和/或意见是我们确定事件发生概率的唯一指南,但这在科学上并不令人满意。 - -# - -## 3.2.2 经验频率 - -另一种确定事件发生概率的方法是多次进行实验,并计算每个事件发生的频率。根据不同结果的相对频率,我们可以计算出每个结果的概率。比如说,我们有兴趣知道旧金山下雨的可能性。首先,我们必须定义实验---假设我们将在 2017 的每一天查看国家气象服务数据(可以从 [HTTPS://www. NCDC.NOAAGOV/](https://www.ncdc.noaa.gov/)下载),并确定在旧金山市中心的气象站是否有雨。 - -```r -# load data on rain in San Francisco and compute probability -SFrain <- read_csv("data/SanFranciscoRain/1329219.csv") - -# create a new variable indicating whether it rained on each day -SFrain <- - SFrain %>% - mutate(rainToday = as.integer(PRCP > 0)) - -SFrain_summary <- - SFrain %>% - summarize( - nRainyDays = sum(rainToday), - nDaysMeasured = n(), - pRainInSF = nRainyDays / nDaysMeasured - ) - -pander(SFrain_summary) -``` - - -| 每天 | 标准测量值 | 普拉宁斯 | -| --- | --- | --- | -| 73 | 365 个 | 0.2 条 | - -根据这些数据,2017 年有 73 个雨天。为了计算旧金山的降雨概率,我们简单地将雨天数除以(365),给出 P(SF 的雨在 2017)=0.2。 - -我们怎么知道经验概率给了我们正确的数字?这个问题的答案来自于 _ 大数定律 _,它表明随着样本量的增加,经验概率将接近真实概率。我们可以通过模拟大量的硬币翻转来看到这一点,并查看我们对每次翻转后头部概率的估计。在后面的章节中,我们将花费更多的时间讨论模拟;现在,假设我们有一种计算方法来为每个硬币翻转生成随机结果。 - -![A demonstration of the law of large numbers. A coin was flipped 30,000 times, and after each flip the probability of heads was computed based on the number of heads and tail collected up to that point. It takes about 15,000 flips for the probability to settle at the true probability of 0.5.](img/file2.png) - -图 3.1 大数定律的演示。一枚硬币被翻转了 30000 次,每次翻转后,头部的概率是根据收集到的头部和尾部的数量来计算的。以 0.5 的真实概率结算的概率大约需要 15000 次翻转。 - -图[3.1](#fig:FlipSim)显示,随着样本数量(即硬币翻转试验)的增加,头部的估计概率收敛到 0.5 的真实值。但是,请注意,当样本量较小时,估计值可能与真实值相差甚远。在 2017 年佐治亚州美国参议院特别选举中,看到了一个现实世界的例子,这场选举让共和党人罗伊·摩尔与民主党人道格·琼斯相提并论。图[3.2](#fig:ElectionResults)显示了随着越来越多的选票被计算在内,当晚每个候选人所报告的选票的相对数量。晚上早些时候,投票数特别不稳定,从琼斯最初的领先优势到摩尔领先的很长一段时间,直到琼斯最终领先赢得比赛。 - -![Relative proportion of the vote in the Dec 12, 2017 special election for the US Senate seat in Georgia, as a function of the percentage of precincts reporting. These data were transcribed from https://www.ajc.com/news/national/alabama-senate-race-live-updates-roy-moore-doug-jones/KPRfkdaweoiXICW3FHjXqI/](img/file3.png) - -图 3.2 2017 年 12 月 12 日美国佐治亚州参议院席位特别选举的投票相对比例,与选区报告百分比的函数关系。这些数据摘自[https://www.ajc.com/news/national/alabama-senate-race-live-updates-roy-moore-doug-jones/kpfkdaweixicw3fhjxqi/](https://www.ajc.com/news/national/alabama-senate-race-live-updates-roy-moore-doug-jones/KPRfkdaweoiXICW3FHjXqI/) - -这两个例子表明,虽然大样本最终会收敛于真实概率,但小样本的结果可能会相差很远。不幸的是,许多人忘记了这一点,并曲解了小样本的结果。心理学家丹尼·卡尼曼和阿莫斯·特沃斯基(Danny Kahneman and Amos Tversky)称之为“小数字定律”(HTG0),他们发现人们(甚至是受过训练的研究人员)的行为通常就好像大数字定律甚至适用于小样本一样,对小数据集的结果给予了过多的信任。.在整个过程中,我们将看到一些例子,说明在小样本的基础上生成统计结果会有多不稳定。 - -# - -## 3.2.3 经典概率 - -我们中的任何一个人都不太可能投过几万次硬币,但我们仍然愿意相信,倒头的概率是 0.5。这反映了另一种计算概率的方法的使用,我们称之为 _ 经典概率 _。在这种方法中,我们直接根据我们对形势的了解来计算概率。 - -经典概率源于对骰子和纸牌等机会游戏的研究。一个著名的例子来自一个法国赌徒遇到的一个问题,这个赌徒的名字是“chevalier de m_r_”。德玛 _r_ 玩了两种不同的骰子游戏:第一种是在六面骰子的四个骰子上赌至少一个六的机会,第二种是在两个骰子的 24 个骰子上赌至少一个六的机会。他希望在这两次赌博中都能赢,但他发现,尽管他在第一次赌博中平均赢了钱,但在第二次赌博中却多次输了钱。为了理解这一点,他求助于他的朋友,数学家布莱斯·帕斯卡,他现在被公认为概率论的创始人之一。 - -我们如何用概率论来理解这个问题?在经典概率论中,我们首先假设样本空间中的所有基本事件都同样可能发生;也就是说,当您滚动一个骰子时,所有可能的结果(1,2,3,4,5,6)都同样可能发生。(不允许加载骰子!)考虑到这一点,我们可以将任何单个结果的概率计算为: - -![](img/95e409ff1b376cb029cc2ea487c0de77.jpg) - -对于六面模具,每个单独结果的概率为 1/6。 - -这很好,但是 de m_r_ 对更复杂的事件感兴趣,比如多个骰子掷骰子时发生的事情。我们如何计算复杂事件(单个事件的联合)的概率,比如在第一个 _ 或 _ 中滚动一个事件或第二个事件?De M_r_ 认为(错误地,我们将在下面看到),他可以简单地将单个事件的概率相加,以计算组合事件的概率,这意味着在第一卷或第二卷上滚动一个事件的概率将计算如下: - -![](img/bcbc006e5ad8ea01c9cd991151fc6685.jpg) - -De M_r_ 基于此推断,四卷中至少六卷的概率是每个单卷的概率之和:![](img/da71c981c0c2a2d3826a404b5c3d26e2.jpg)。同样地,他推断,因为掷骰子时两个 6 的概率是 1/36,那么两个骰子的 24 卷骰子中至少一个 6 的概率是![](img/a6c683fede93757044be9205d9827e9d.jpg)。然而,尽管他总是在第一次下注中赢了钱,但在第二次下注中却输了钱。什么给予? - -为了理解 de m_r_ 的误差,我们需要引入概率论的一些规则。第一个是减法规则(htg0),即: - -![](img/7c5ff5ec992fd140f40694ffe951c49b.jpg) - -其中![](img/d8ac0924e8f1d43d7c6f957fb99f16f1.jpg)表示“非 a”。这个规则直接从我们上面讨论的公理中推导出来;因为 a 和![](img/d8ac0924e8f1d43d7c6f957fb99f16f1.jpg)是唯一可能的结果,所以它们的总概率必须加为 1。例如,如果在一次投掷中滚动一个物体的概率是![](img/2a4ca4061c264ca4697c0f4dc502a667.jpg),那么滚动除一个物体以外的任何物体的概率是![](img/74fd2a08ed4fd074168468efb99ab03a.jpg)。 - -第二条规则告诉我们如何计算联合事件的概率——也就是说,两个事件同时发生的概率。这个版本的规则告诉我们,在特殊情况下,当两个事件彼此独立时,如何计算这个量;我们稍后将确切地了解 _ 独立性 _ 的概念意味着什么,但现在我们可以想当然地认为这两个掷模是不独立的。ndent 事件。 - -![](img/bc104146831670ea28c529ac67c64009.jpg) - -因此,向两个辊中的每一辊投掷六个辊的概率是![](img/781e1bff976b78c3695802c1faa6f8ad.jpg)。 - -第三条规则告诉我们如何将概率相加——这里我们看到了 de m_r_ 错误的来源。加法规则告诉我们: - -![](img/1f2e4d778effc506dc13daace0ce132a.jpg) - -也就是说,A 或 B 发生的概率是通过将单个概率相加,然后减去两者同时发生的可能性来确定的。在某种意义上,这会阻止我们将这些实例计数两次。假设我们想找出在两个投掷中的任何一个上滚动 6 的概率。根据我们的规则: - -![](img/892769b632eb5c613f1169dfe81a565a.jpg)![](img/8746db7c69c50dd130ae037340d94252.jpg)![Each cell in this matrix represents one outcome of two throws of a die, with the columns representing the first throw and the rows representing the second throw. Cells shown in light blue represent the cells with a one in either the first or second throw; the rest are shown in dark blue.](img/file4.png) - -图 3.3 这个矩阵中的每个单元格表示一个 die 的两次 throw 的一个结果,其中列表示第一次 throw,行表示第二次 throw。浅蓝色显示的单元格表示第一次或第二次投掷中有一个单元格的单元格;其余的单元格显示为深蓝色。 - -让我们使用一个图形化的描述来获得这个规则的不同视图。图[3.3](#fig:ThrowMatrix)显示了一个表示所有可能抛出的矩阵,并突出显示了在第一次或第二次抛出中涉及一个抛出的单元格。如果你用浅蓝色数数这些细胞,你会发现有 11 个这样的细胞。这说明了为什么加法规则给出了与 de m_r_ 不同的答案;如果我们像他那样简单地把两次掷骰的概率相加,那么我们将对两次掷骰都计算(1,1),而实际上只计算一次。 - -# - -## 3.2.4 解决 de m_r_ 的问题 - -布莱斯·帕斯卡利用概率法则提出了一个解决德玛·R·_ 问题的方法。首先,他意识到,从一个组合中计算出至少一个事件的概率是很困难的,而计算出某个事件在多个事件中不发生的概率相对来说比较容易——这只是单个事件概率的乘积。因此,他不是计算四卷中至少六卷的概率,而是计算所有卷中没有混乱的概率: - -![](img/4275552aeb5f9f21d1301d414adb1fb3.jpg) - -然后,他利用四卷纸中无六个的概率是四卷纸中至少六个六个的补数(因此必须求和为一),并使用减法规则计算利息概率: - -![](img/a3678e8ff457f54d80e648c09ae0371d.jpg) - -德玛 __ 赌他会投至少六分之一的骰子的概率大于 0.5,这解释了德玛 ____ 为什么在这个赌注上平均赚钱。 - -但是,德姆雷尔的第二个赌注呢?帕斯卡使用了同样的技巧: - -![](img/d936c28e10e1a1bc69e4c816ec96bc11.jpg)![](img/b6ebca7c62fba5e97cab41a2627210b2.jpg) - -这一结果的概率略低于 0.5,这说明了为什么在这场赌博中,de m_r_ 平均赔钱。 - -## 3.3 概率分布 - -我们通常希望能够量化实验中任何可能值的概率。例如,在 2018 年 1 月 20 日,篮球运动员斯蒂芬·科里在与休斯顿火箭队的比赛中 4 次罚球中只有 2 次命中。我们知道库里在整个赛季的罚球命中率是 0.91,所以他在一场比赛中只命中 50%的罚球似乎是不太可能的,但这到底有多不可能呢?我们可以使用理论概率分布来确定这一点;在本课程中,我们将遇到许多这样的概率分布,每个概率分布都适合描述不同类型的数据。在这种情况下,我们使用 _ 二项式 _ 分布,它提供了一种方法来计算在给定一些已知的成功概率的情况下,许多“伯努利试验”(即,成功或失败的试验,两者之间没有任何结果)中一些成功的概率。每次审判。此分布定义为: - -![](img/6683d37792dc1e56e56c6099b321ad83.jpg) - -这是指成功概率为 p 时 n 次试验中 k 次成功的概率。您可能不熟悉![](img/9ed5422e7bd57da013ac5ba0daaa03a3.jpg),这被称为 _ 二项式系数 _。二项式系数也被称为“n-choose-k”,因为它描述了从 n 个项目中选择 k 个项目的不同方法的数量。二项式系数计算如下: - -![](img/bb538274ffbc9778bd28b556e9b8aff6.jpg) - -解释点在哪里!!)指数字的 _ 阶乘 _: - -![](img/f51d0fc8f546942bd6c2d7367b14cab1.jpg) - -以斯蒂芬·库里的罚球为例: - -![](img/38dc510f295ceb4a1b3e67f0f4c0d387.jpg) - -这表明,考虑到库里的总罚球率,他不太可能在 4 次罚球中只命中 2 次。这只是为了表明不太可能的事情实际上发生在现实世界中。 - -# - -## 3.3.1 累积概率分布 - -通常我们不仅想知道某个特定值的可能性有多大,而且想知道找到一个和某个特定值一样极端或更极端的值的可能性有多大。为了回答这个问题,我们可以使用 _ 累积 _ 概率分布;而标准概率分布告诉我们某个特定值的概率,而累积分布告诉我们一个值比它大或大(或小或小)的概率。Me 特定值。 - -在罚球的例子中,我们可能想知道:如果斯蒂芬·库里的罚球概率为 0.91,那么他在四个罚球中命中 2 个(htg0)或更少(htg1)的概率是多少。为了确定这一点,我们可以简单地使用二项式概率方程并插入 k 的所有可能值: - -![](img/f90534da8e5ce69cefbbd9ea90158a03.jpg) - -在许多情况下,可能的结果数量对于我们来说太大,无法通过列举所有可能的值来计算累积概率;幸运的是,它可以直接计算。对于二项式,我们可以使用`pbinom()`函数在 r 中执行此操作: - -```r -# compute cumulative probability distribution for Curry's free throws - -tibble( - numSuccesses = seq(0, 4) -) %>% - mutate( - probability = pbinom(numSuccesses, size = 4, prob = 0.91) - ) %>% - pander() -``` - - -| 无数次成功 | 可能性 | -| --- | --- | -| 0 | 0 | -| 1 个 | 0.003 个 | -| 二 | 0.043 个 | -| 三 | 0.314 个 | -| 4 | 1 | - -由此我们可以看出咖喱在 4 次尝试中 2 次或更少的罚球机会是 0.043。 - -## 3.4 条件概率 - -到目前为止,我们只局限于简单的概率——即单个事件或事件组合的概率。然而,我们通常希望确定某些事件发生的概率,因为已经发生了一些其他事件,这些事件被称为 _ 条件概率 _。 - -让我们以 2016 年美国总统大选为例。我们可以用两个简单的概率来描述选民。首先,我们知道美国选民与共和党有关联的可能性:![](img/d6680eda24388114adc889ffab670301.jpg)。我们也知道选民投票支持唐纳德·特朗普的可能性。但是,假设我们想知道以下情况:一个人投给唐纳德·特朗普(Donald Trump)的票的概率是多少,因为他们是共和党人? - -要计算给定 b 的条件概率(我们写为![](img/24f22119f3e28693fc84dea1ef25fb4f.jpg),“a 的概率,给定 b”),我们需要知道 _ 联合概率 _(即概率 a 和 b)以及 b 的总体概率: - -![](img/69e666309337d791dcdc76d4ad4752b1.jpg) - -也就是说,我们想知道两件事都是真的概率,前提是被制约的一件事是真的。 - -![A graphical depiction of conditional probability, showing how the conditional probability limits our analysis to a subset of the data.](img/file5.png) - -图 3.4 条件概率的图形描述,显示了条件概率如何限制我们对数据子集的分析。 - -从图形的角度考虑这一点很有用。图[3.4](#fig:conditionalProbability)显示了一个流程图,描绘了全体选民如何分解为共和党和民主党,以及条件概率(对政党的条件)如何根据他们的投票进一步分解每一个政党的成员。 - -## 3.5 根据数据计算条件概率 - -对于本课程中的许多例子,我们将使用从国家健康和营养检查调查(NHANES)获得的数据。NHANES 是美国疾病控制中心组织的一项正在进行的大型研究,旨在全面了解美国成人和儿童的健康和营养状况。每年,这项调查都会通过访谈和身体和医学测试,对美国大约 5000 人的样本进行调查。nhanes 数据作为一个包包含在 r 中,使其易于访问和使用。它还为我们提供了一个大型的、现实的数据集,作为许多不同统计工具的示例。 - -假设我们对以下问题很感兴趣:考虑到某人身体不活跃,他们患糖尿病的可能性有多大?--这就是![](img/49b313eeffd936da193774795c88ae98.jpg)。nhanes 记录了两个变量,解决了这个问题的两个部分。第一个(`Diabetes`)询问患者是否被告知患有糖尿病,第二个(`PhysActive`)记录患者是否从事至少中等强度的运动、健身或娱乐活动。我们先计算一下简单的概率。 - -```r -# Summarize NHANES data for diabetes and physical activity - -# drop duplicated IDs within the NHANES dataset -NHANES_diabetes_activity <- - NHANES %>% - distinct(ID, .keep_all = TRUE) %>% - drop_na(PhysActive, Diabetes) - -pander('Summary data for diabetes') -``` - -糖尿病汇总数据 - -```r -NHANES_diabetes_activity %>% - count(Diabetes) %>% - mutate( - prob = n / sum(n) - ) %>% - pander() -``` - - -| 糖尿病 | N 号 | 问题 | -| --- | --- | --- | -| 不 | 4893 个 | 0.899 个 | -| 是的 | 550 个 | 0.101 个 | - -```r -pander('Summary data for physical activity') -``` - -体育活动汇总数据 - -```r -NHANES_diabetes_activity %>% - count(PhysActive) %>% - mutate( - prob = n / sum(n) - ) %>% - pander() -``` - - -| 物理激活 | n | prob | -| --- | --- | --- | -| No | 2472 个 | 0.454 个 | -| Yes | 2971 年 | 0.546 个 | - -这表明 nhanes 数据集中的某个人患糖尿病的概率是 0.101,而某个人不活跃的概率是 0.454。 - -为了计算![](img/49b313eeffd936da193774795c88ae98.jpg),我们还需要知道糖尿病 _ 和 _ 不活动的联合概率,除了以下两种情况的简单概率: - -```r -# compute joint probabilities for diabetes and physical activity - -NHANES_diabetes_stats_by_activity <- - NHANES_diabetes_activity %>% - count(Diabetes, PhysActive) %>% - mutate( - prob = n / sum(n) - ) - -pander(NHANES_diabetes_stats_by_activity) -``` - - -| Diabetes | PhysActive | n | prob | -| --- | --- | --- | --- | -| No | No | 2123 个 | 0.39 分 | -| No | Yes | 2770 个 | 0.509 个 | -| Yes | No | 349 个 | 0.064 个 | -| Yes | Yes | 201 年 | 0.037 个 | - -基于这些联合概率,我们可以计算![](img/49b313eeffd936da193774795c88ae98.jpg): - -```r -# compute conditional probability p(diabetes|inactive) - -P_inactive <- - NHANES_diabetes_activity %>% - summarise( - mean(PhysActive == "No") - ) %>% - pull() - -P_diabetes_and_inactive <- - NHANES_diabetes_stats_by_activity %>% - dplyr::filter(Diabetes == "Yes", PhysActive == "No") %>% - pull(prob) - -P_diabetes_given_inactive <- - P_diabetes_and_inactive / P_inactive - -P_diabetes_given_inactive -``` - -```r -## [1] 0.1411812 -``` - -该块中的第一行代码通过测试每个独立的 physactive 变量是否等于“no”来计算![](img/1f17fd694a3be72e2afad017324c7c69.jpg)。这个技巧是有效的,因为 r 将真/假值分别视为 1/0;因此,如果我们想知道某个事件的可能性,我们可以生成一个布尔变量来测试该事件,然后简单地取该变量的平均值。然后我们用这个值来计算条件概率,我们发现一个人患糖尿病的概率是 0.141。 - -## 3.6 独立性 - -“独立”一词在统计学中有着非常具体的含义,这与该词的常用用法有些不同。两个变量之间的统计独立性意味着知道一个变量的值并不能告诉我们关于另一个变量的值。这可以表示为: - -![](img/78da5e67dcc3011e38046fcdbc4b98ad.jpg) - -也就是说,给定某个 b 值的概率与 a 的总体概率相同。这样看,我们看到世界上许多我们称之为“独立”的情况实际上并不是统计上独立的。例如,目前有一个由加利福尼亚州公民组成的小组宣布成立一个新的独立州杰斐逊,该州将包括加利福尼亚州北部和俄勒冈州的一些县。如果发生这种情况,那么当前加利福尼亚州居民现在居住在杰斐逊州的概率将是![](img/a580a173e7dba283e0e77c3b3b96bbaa.jpg),而他们仍然是加利福尼亚州居民的概率将是![](img/dd69f4593c37ae11cc30bc339330123b.jpg)。新的国家在政治上可能是独立的,但他们在统计上不会是独立的,因为(HTG4)!也就是说,虽然公共语言中的独立性通常指的是排他的集合,但是统计独立性指的是这样一种情况,即人们不能从另一个变量的值中预测关于一个变量的任何东西。例如,知道一个人的头发颜色不太可能告诉你他们喜欢巧克力还是草莓冰淇淋。 - -让我们来看另一个例子,使用 nhanes 数据:身体健康和心理健康是相互独立的吗?NHANES 包括两个相关问题:【htg0】physactive【htg1】,询问个人是否有体力活动;以及【htg2】daysmenthlthbad【htg3】,询问个人在过去 30 天中有多少天的精神健康状况不佳。我们将定义一个新的变量,称为“不良心理健康”,即在上个月有超过 7 天的不良心理健康,然后通过询问简单的不良心理健康概率是否与不良心理健康的条件概率不同来确定它们是否独立。即使身体很活跃。 - -```r -# compute probabilities for mental health and physical activity -NHANES_adult <- - NHANES %>% - dplyr::filter( - Age >= 18, - !is.na(PhysActive), - !is.na(DaysMentHlthBad) - ) %>% - mutate(badMentalHealth = DaysMentHlthBad > 7) - -NHANES_MentalHealth_summary <- - NHANES_adult %>% - summarize(badMentalHealth = mean(badMentalHealth)) - -pander(NHANES_MentalHealth_summary) -``` - - -| 心理健康 | -| --- | -| 0.164 个 | - -```r -NHANES_MentalHealth_by_PhysActive <- - NHANES_adult %>% - group_by(PhysActive) %>% - summarize(badMentalHealth = mean(badMentalHealth)) - -pander(NHANES_MentalHealth_by_PhysActive) -``` - - -| 物理激活 | badMentalHealth | -| --- | --- | -| 不 | 0.2 条 | -| 是的 | 0.132 个 | - -由此我们可以看出![](img/d59d2396e8e39871603921abbcf5e286.jpg)是 0.1640567,而![](img/6809316d601f4f790ba83cb237878ecb.jpg)是 0.1320808。因此,条件概率似乎比总概率小一些,这表明它们不是独立的,尽管我们不能通过观察数字来确定。在课程的后面,我们将遇到一些工具,这些工具将使我们更直接地量化两个变量是否独立。 - -## 3.7 逆转条件概率:贝叶斯规则 - -在许多情况下,我们知道![](img/24f22119f3e28693fc84dea1ef25fb4f.jpg),但我们真的想知道![](img/04e4300663edc1c8ba9ee7619d492ff0.jpg)。这通常发生在医学筛查中,我们知道(htg2),但我们想知道的是(htg3)。例如,一些医生建议 50 岁以上的男性接受前列腺特异性抗原(PSA)检测,以筛查可能的前列腺癌。在试验被批准用于医疗实践之前,制造商需要测试试验性能的两个方面。首先,他们需要展示(htg4)是如何敏感的(htg5),也就是说,当疾病出现时,它有多大可能找到它。他们还需要展示 _ 的特异性 _ 是如何的:也就是说,当没有疾病存在时,它有多可能产生阴性结果![](img/11a24376d41fe831e2b1a75ac35a795c.jpg)。对于变压吸附试验,我们知道敏感性约为 80%,特异性约为 70%。然而,这些并不能回答医生想要回答的问题:如果检测结果呈阳性,他们患癌症的可能性有多大?这要求我们颠倒定义灵敏度的条件概率:而不是我们想要知道的![](img/335536b8369d59f82cbf5856cbfa3fad.jpg)。 - -为了逆转条件概率,我们可以使用 _ 贝叶斯规则 _: - -![](img/a108a589f3ef6bc25721628a8017fda6.jpg) - -根据本章前面所学的概率规则,贝叶斯规则相当容易推导。首先,记住计算条件概率的规则: - -![](img/69e666309337d791dcdc76d4ad4752b1.jpg) - -我们可以重新排列,得到用条件计算联合概率的公式: - -![](img/c279a95d3c89df0b5ec444ff437571c3.jpg) - -利用这一点,我们可以计算反概率: - -![](img/86e5a13c055b54d6a6910677470b88b4.jpg) - -如果我们只有两个结果,我们可以用更清晰的方式表达,使用和规则重新定义![](img/b029cb77c2d095be990d28206f5331fb.jpg): - -![](img/8f21133de288eed7ed24804b9b561686.jpg) - -利用这个,我们可以重新定义贝叶斯规则: - -![](img/b94584013098374a0ab47488f17113bf.jpg) - -我们可以将相关的数字插入到这个方程中,以确定一个 PSA 结果为阳性的个体确实患有癌症的可能性——但要注意,为了做到这一点,我们还需要知道这个人患癌症的总概率,我们通常将其称为 _ 基 r。吃了 _。让我们以一个 60 岁的男人为例,他在未来 10 年中患前列腺癌的概率是![](img/f3a4a8ba6e1ea77eb2e2ce3f632393f3.jpg)。利用我们上面概述的敏感性和特异性值,我们可以通过阳性测试来计算患者患癌症的可能性: - -![](img/e244f05680b0d348b92cfc43d72cebb3.jpg)![](img/b30dad3c92a0b9d823ada3ca716d2e8e.jpg) - -那太小了——你觉得奇怪吗?许多人这样做,事实上,有大量的心理学文献表明,人们在判断时系统地忽视了 _ 基本比率 _(即总体患病率)。 - -## 3.8 数据学习 - -另一种看待 Bayes 法则的方法是根据数据更新我们的信仰——也就是说,利用数据了解世界。让我们再看一下贝叶斯法则: - -![](img/643f8315b1aea5ac8d51b0398b8bdf01.jpg) - -Bayes 规则的不同部分有特定的名称,这与它们在使用 Bayes 规则更新我们信仰中的作用有关。我们首先对 b(![](img/df4fe93523fb241ffac9274788373abd.jpg))的概率进行初步猜测,我们称之为 _ 先验 _ 概率。在变压吸附的例子中,我们使用了之前的基本速率,因为在我们知道测试结果之前这是我们最好的猜测。然后我们收集一些数据,在我们的示例中是测试结果。数据 A 与结果 B 的一致程度由![](img/24f22119f3e28693fc84dea1ef25fb4f.jpg)给出,我们称之为 _ 可能性 _。你可以把这看作是数据的可能性,考虑到特定的假设正在被检验。在我们的例子中,被测试的假设是个体是否患有癌症,可能性是基于我们对测试特殊性的了解。分母(![](img/b029cb77c2d095be990d28206f5331fb.jpg))被称为 _ 边际似然 _,因为它表示数据的总体似然性,在 a 的所有可能值(在我们的示例中是正的和负的测试结果)中取平均值。左边的结果(![](img/04e4300663edc1c8ba9ee7619d492ff0.jpg))被称为 _ 后面的 _——因为它是计算的后端。 - -有另一种方法来编写贝叶斯规则,使这一点更加清晰: - -![](img/00898e5a9153344b32d0f92370330484.jpg) - -左边的部分(![](img/93531d7b720068120e0de15fe39bdc50.jpg))告诉我们,相对于数据的总体(边际)可能性,A 被赋予的可能性有多大,或者更少;右边的部分(![](img/df4fe93523fb241ffac9274788373abd.jpg))告诉我们,我们认为 B(在我们了解数据之前)的可能性有多大。这就更清楚了,贝叶斯定理的作用是根据数据比整体更可能被赋予 b 的程度来更新我们的先验知识。 - -## 3.9 优势比 - -![](img/f5e7f7ff9510714766c40c5104bc5095.jpg) - -最后一节的结果显示,基于阳性的 PSA 测试结果,个体患癌症的可能性仍然相当低,尽管它比我们知道测试结果之前大了两倍多。我们通常希望更直接地量化概率之间的关系,我们可以将它们转换为 _ 概率 _,它表示发生或不发生事件的相对可能性: - -在我们的 PSA 例子中,患癌症的几率(假设阳性测试)是: - -![](img/da27ec811744735eaaffd9becb99fe83.jpg) - -这告诉我们,即使测试呈阳性,患癌症的几率也相当低。相比之下,在一次掷骰子中掷 6 的几率是: - -![](img/6c620c7b5d0342b7549c747042757d2a.jpg) - -另一方面,这也是许多医学研究人员越来越担心在相对不常见的情况下使用广泛的筛查测试的原因;大多数阳性结果将被证明是假阳性。 - -我们也可以通过计算所谓的 _ 比值比 _ 来比较不同的概率,这正是它听起来的样子。例如,假设我们想知道阳性测试会增加患者患癌症的几率。我们可以首先计算 _ 先验概率 _——也就是说,在我们知道这个人做了阳性测试之前的概率。这些是使用基本利率计算的: - -![](img/98fbaf2155933cc390bab248593502c3.jpg) - -然后,我们可以将其与后验概率进行比较,后验概率通过后验概率计算得出: - -![](img/f89093fbc7b2769ca9937c41bff7e47b.jpg) - -这告诉我们,鉴于阳性测试结果,患癌症的几率增加了 2.62。 \ No newline at end of file diff --git a/docs/4.md b/docs/4.md index ad9e5dceb721217ed67824e8ef7121b6bb19742b..00fe8c3cce30d1c6524cac34c16d4e77469b74f5 100644 --- a/docs/4.md +++ b/docs/4.md @@ -1,3 +1,298 @@ # 4 汇总数据 -在本章中,我们将讨论为什么以及如何总结数据。 \ No newline at end of file +在本章中,我们将讨论为什么以及如何总结数据。 + +## 4.1 为什么要总结数据? + +当我们总结数据时,我们必然会丢弃信息,对此有许多可以想象的反对意见。作为一个例子,让我们回到我们在第 1 章中讨论的纯研究。除了数据集中总结的那些细节之外,我们是否不应该相信每个单独的事物的所有细节?关于如何收集数据的具体细节,如一天中的时间或参与者的心情,如何?当我们总结数据时,所有这些细节都会丢失。 + +我们一般总结数据,因为它为我们提供了一种概括 _ 的方法,也就是说,使一般性陈述超出特定的观察范围。作家豪尔赫·路易斯·博尔赫斯(JorgeLuisBorges)在其短篇小说《取笑记忆》(funes the memorious)中强调了概括的重要性,该小说描述了一个失去遗忘能力的人。博尔赫斯专注于归纳(即扔掉数据)和思考之间的关系:“思考就是忘记差异,归纳,抽象。在富丽堂皇的 funes 世界里,只有细节。”_ + +心理学家长期以来研究了归纳法对思维的核心作用。一个例子是分类:我们能够很容易地识别“鸟类”类别的不同例子,即使个别例子在表面特征上可能非常不同(例如鸵鸟、知更鸟和鸡)。重要的是,泛化可以让我们对这些个体做出预测——就鸟类而言,我们可以预测它们会飞和吃蠕虫,它们可能不会开车或说英语。这些预测并不总是正确的,但它们往往足够好,能够在世界上发挥作用。 + +## 4.2 使用表格汇总数据 + +总结数据的一个简单方法是生成一个表,表示各种类型观测的计数。这种类型的表已经使用了数千年(见图[4.1](#fig:salesContract))。 + +![A Sumerian tablet from the Louvre, showing a sales contract for a house and field. Public domain, via Wikimedia Commons.](img/file6.jpg) + +图 4.1 卢浮宫的苏美尔平板电脑,显示房屋和田地的销售合同。公共领域,通过维基共享资源。 + +让我们来看一些使用表的例子,同样使用 nhanes 数据集。在 rstudio 控制台中键入命令`help(NHANES)`,然后滚动查看帮助页面,如果使用 rstudio,该页面将在帮助面板中打开。此页提供有关数据集的一些信息以及数据集中包含的所有变量的列表。让我们来看一个简单的变量,在数据集中称为“physactive”。此变量包含三个不同值中的一个:“是”或“否”(指示此人是否报告正在进行“中等强度或剧烈强度的运动、健身或娱乐活动”),如果该个人缺少数据,则为“不”。有不同的原因导致数据丢失;例如,这一问题不是针对 12 岁以下的儿童提出的,而在其他情况下,成人可能在采访期间拒绝回答这个问题。 + +# + +## 4.2.1 频率分布 + +让我们看看每个类别中有多少人。现在不要担心 R 到底是怎么做的,我们稍后再谈。 + +```r +# summarize physical activity data + +PhysActive_table <- NHANES %>% + dplyr::select(PhysActive) %>% + group_by(PhysActive) %>% + summarize(AbsoluteFrequency = n()) + +pander(PhysActive_table) +``` + + +| 物理激活 | 绝对频率 | +| --- | --- | +| 不 | 2473 个 | +| 是的 | 2972 年 | +| 不适用 | 1334 年 | + +此单元格中的 r 代码生成一个表格,显示每个不同值的频率;有 2473 名回答“否”的人,2972 名回答“是”,1334 名没有回答。我们称之为 _ 频率分布 _,因为它告诉我们每个值是如何分布在样本中的。 + +因为我们只想与回答问题的人一起工作,所以让我们过滤数据集,使其只包括回答此问题的个人。 + +```r +# summarize physical activity data after dropping NA values using drop_na() + +NHANES %>% + drop_na(PhysActive) %>% + dplyr::select(PhysActive) %>% + group_by(PhysActive) %>% + summarize(AbsoluteFrequency = n()) %>% + pander() +``` + + +| PhysActive | AbsoluteFrequency | +| --- | --- | +| No | 2473 | +| Yes | 2972 | + +这向我们展示了两个响应的绝对频率,对于每个实际给出响应的人。从这一点上我们可以看出,说“是”的人比说“不”的人多,但从绝对数上很难分辨出差别有多大。因此,我们通常希望使用 _ 相对频率 _ 来呈现数据,该相对频率是通过将每个频率除以所有频率的和得到的: + +![](img/e4cafb8e8a9e4428a56a958889be4a26.jpg) + +在 R 中我们可以这样做,如下所示: + +```r +# compute relative frequency of physical activity categories + +NHANES %>% + drop_na(PhysActive) %>% + dplyr::select(PhysActive) %>% + group_by(PhysActive) %>% + summarize(AbsoluteFrequency = n()) %>% + mutate(RelativeFrequency = AbsoluteFrequency / sum(AbsoluteFrequency)) %>% + pander() +``` + + +| PhysActive | AbsoluteFrequency | 相对频率 | +| --- | --- | --- | +| No | 2473 | 0.454 个 | +| Yes | 2972 | 0.546 个 | + +相对频率提供了一种更简单的方法来判断不平衡的程度。我们还可以通过将相对频率乘以 100 来将其解释为百分比: + +```r +# compute percentages for physical activity categories + +PhysActive_table_filtered <- NHANES %>% + drop_na(PhysActive) %>% + dplyr::select(PhysActive) %>% + group_by(PhysActive) %>% + summarize(AbsoluteFrequency = n()) %>% + mutate( + RelativeFrequency = AbsoluteFrequency / sum(AbsoluteFrequency), + Percentage = RelativeFrequency * 100 + ) + +pander(PhysActive_table_filtered) +``` + + +| PhysActive | AbsoluteFrequency | RelativeFrequency | 百分比 | +| --- | --- | --- | --- | +| No | 2473 | 0.454 | 45.418 美元 | +| Yes | 2972 | 0.546 | 54.582 条 | + +这让我们看到,NHANES 样本中 45.42%的人说“不”,54.58%的人说“是”。 + +# + +## 4.2.2 累积分布 + +我们在上面研究的 physactive 变量只有两个可能的值,但我们通常希望总结出可以有更多可能值的数据。当这些值至少是序数时,总结它们的一个有用方法是通过我们所称的 _ 累积 _ 频率表示:我们不询问对特定值进行多少观察,而是询问有多少个值至少是 _ 某个特定值。_ + +让我们看一下 nhanes 数据集中的另一个变量,名为 sleephrsnight,它记录了参与者在正常工作日报告睡眠的时间。让我们像上面一样创建一个频率表,在删除了没有对问题作出响应的任何人之后。 + +```r +# create summary table for relative frequency of different +# values of SleepHrsNight + +NHANES %>% + drop_na(SleepHrsNight) %>% + dplyr::select(SleepHrsNight) %>% + group_by(SleepHrsNight) %>% + summarize(AbsoluteFrequency = n()) %>% + mutate( + RelativeFrequency = AbsoluteFrequency / sum(AbsoluteFrequency), + Percentage = RelativeFrequency * 100 + ) %>% + pander() +``` + + +| 睡眠之光 | AbsoluteFrequency | RelativeFrequency | Percentage | +| --- | --- | --- | --- | +| 二 | 9 | 0.002 个 | 0.179 个 | +| 三 | 49 岁 | 0.01 分 | 0.973 个 | +| 4 | 200 个 | 0.04 分 | 3.972 年 | +| 5 个 | 406 个 | 0.081 个 | 8.064 年 | +| 6 | 1172 年 | 0.233 个 | 23.277 页 | +| 7 | 1394 年 | 0.277 个 | 27.686 年 | +| 8 个 | 1405 年 | 0.279 个 | 27.905 年 | +| 9 | 271 个 | 0.054 个 | 5.382 条 | +| 10 个 | 97 | 0.019 个 | 1.927 个 | +| 11 个 | 15 个 | 0.003 个 | 0.298 个 | +| 12 个 | 17 | 0.003 | 0.338 个 | + +我们可以通过查看表开始汇总数据集;例如,我们可以看到大多数人报告睡眠时间在 6 到 8 小时之间。让我们绘制数据以更清楚地看到这一点。要做到这一点,我们可以绘制一个 _ 柱状图 _,它显示具有每个不同值的事例数;请参见图[4.2](#fig:sleepHist)的左面板。ggplot2()库有一个内置的柱状图函数(`geom_histogram()`),我们经常使用它。我们还可以绘制相对频率,我们通常将其称为 _ 密度 _——参见图[4.2](#fig:sleepHist)的右面板。 + +![Left: Histogram showing the number (left) and proportion (right) of people reporting each possible value of the SleepHrsNight variable.](img/file7.png) + +图 4.2 左:显示报告 sleephrsnight 变量每个可能值的人数(左)和比例(右)的柱状图。 + +如果我们想知道有多少人报告睡眠 5 小时或更少怎么办?为了找到这个,我们可以计算一个 _ 累积分布 _: + +![](img/ff7ab633040472ac2bce1842214d5049.jpg) + +也就是说,为了计算某个值 j 的累积频率,我们将所有值(包括 j)的频率相加。让我们对睡眠变量进行计算,首先对绝对频率进行计算: + +```r +# create cumulative frequency distribution of SleepHrsNight data + +SleepHrsNight_cumulative <- + NHANES %>% + drop_na(SleepHrsNight) %>% + dplyr::select(SleepHrsNight) %>% + group_by(SleepHrsNight) %>% + summarize(AbsoluteFrequency = n()) %>% + mutate(CumulativeFrequency = cumsum(AbsoluteFrequency)) + +pander(SleepHrsNight_cumulative) +``` + + +| SleepHrsNight | AbsoluteFrequency | 累积频率 | +| --- | --- | --- | +| 2 | 9 | 9 | +| 3 | 49 | 58 | +| 4 | 200 | 258 个 | +| 5 | 406 | 664 个 | +| 6 | 1172 | 1836 年 | +| 7 | 1394 | 3230 个 | +| 8 | 1405 | 4635 个 | +| 9 | 271 | 4906 个 | +| 10 | 97 | 5003 个 | +| 11 | 15 | 5018 年 | +| 12 | 17 | 5035 个 | + +在图[4.3](#fig:sleepAbsCumulRelFreq)的左侧面板中,我们绘制了数据,以查看这些表示形式的外观;绝对频率值以红色绘制,累积频率以蓝色绘制。我们看到累积频率是单调递增的,也就是说,它只能上升或保持不变,但不能下降。同样,我们通常发现相对频率比绝对频率更有用;这些频率绘制在图[4.3](#fig:sleepAbsCumulRelFreq)的右面板中。 + +![A plot of the relative (red) and cumulative relative (blue) values for frequency (left) and proportion (right) for the possible values of SleepHrsNight.](img/file8.png) + +图 4.3 SleephrsNight 可能值的频率(左)和比例(右)的相对(红)和累积相对(蓝)值的图。 + +# + +## 4.2.3 绘制柱状图 + +![A histogram of the Age (left) and Height (right) variables in NHANES.](img/file9.png) + +图 4.4 nhanes 中年龄(左)和身高(右)变量的柱状图。 + +我们在上面研究的变量相当简单,只有几个可能的值。现在让我们来看一个更复杂的变量:年龄。首先,让我们绘制 nhanes 数据集中所有个体的年龄变量(参见图[4.4](#fig:ageHist)的左面板)。你看到了什么?首先,你应该注意到每个年龄组的个体数量随着时间的推移而减少。这是有道理的,因为人口是随机抽样的,因此随着时间的推移死亡导致老年人的数量减少。其次,你可能在 80 岁的时候注意到图表中有一个大的尖峰。你觉得这是怎么回事? + +如果您查看 nhanes 数据集的帮助功能,您将看到以下定义:“研究参与者筛选的年龄(年)。注:80 岁或 80 岁以上的受试者被记录为 80 岁。“原因在于,年龄很高的受试者数量相对较少,如果你知道他们的确切年龄,就可能更容易在数据集中识别出特定的人;研究人员通常承诺他们的参与蚂蚁要对自己的身份保密,这是他们能做的有助于保护研究对象的事情之一。这也突显了一个事实,即知道一个人的数据来自何处以及如何处理它们总是很重要的;否则,我们可能会不正确地解释它们。 + +让我们看看 nhanes 数据集中另一个更复杂的变量:高度。高度值的柱状图绘制在图[4.4](#fig:ageHist)的右面板中。关于这个分布你首先应该注意的是,它的大部分密度集中在 170 厘米左右,但是分布的左侧有一个“尾巴”;有少数个体的高度要小得多。你觉得这是怎么回事? + +您可能已经直觉到小高度来自数据集中的子级。检查这一点的一种方法是为儿童和成人绘制单独颜色的柱状图(图[4.5](#fig:heightHistSep)的左面板)。这表明,所有非常短的高度确实来自样本中的儿童。让我们创建一个新版本的 nhanes,它只包含成年人,然后为他们绘制柱状图(图[4.5](#fig:heightHistSep)的右面板)。在这个图中,分布看起来更加对称。正如我们稍后将看到的,这是一个 _ 正态 _(或 _ 高斯 _)分布的很好例子。 + +![Histogram of heights for NHANES. A: values plotted separately for children (blue) and adults (red). B: values for adults only. C: Same as B, but with bin width = 0.1](img/file10.png) + +图 4.5 nhanes 高度柱状图。A:分别为儿童(蓝色)和成人(红色)绘制的值。B:仅限成人使用。C:与 B 相同,但仓宽=0.1 + +# + +## 4.2.4 柱状图箱 + +在我们前面使用睡眠变量的例子中,数据是以整数报告的,我们只计算报告每个可能值的人数。但是,如果您查看 nhanes 中高度变量的一些值,您将看到它是以厘米为单位测量的,一直到小数点后一位: + +```r +# take a slice of a few values from the full data frame +NHANES_adult %>% + dplyr::select(Height) %>% + slice(45:50) %>% + pander() +``` + + +| 高度 | +| --- | +| 169.6 条 | +| 169.8 条 | +| 167.5 条 | +| 155.2 条 | +| 173.8 条 | +| 174.5 条 | + +图[4.5](#fig:heightHistSep)的面板 C 显示了统计每个可能值的密度的直方图。这个柱状图看起来真的参差不齐,这是因为特定的小数位值的可变性。例如,值 173.2 出现 32 次,而值 173.3 只出现 15 次。我们可能不认为这两个权重的流行率真的有如此大的差异;更可能的原因是我们的样本中的随机变异性。 + +一般来说,当我们创建一个连续的或可能有很多值的数据柱状图时,我们将 _bin_ 这些值,这样我们就不会计算和绘制每个特定值的频率,而是计算和绘制特定范围内的值的频率。e.这就是为什么上面[4.5](#fig:heightHistSep)的面板 B 中的图看起来不那么锯齿状的原因;如果您查看`geom_histogram`命令,您将看到我们设置了“b in width=1”,它告诉命令通过将 b in 中的值与宽度为 1 的值组合来计算柱状图;因此,值 1.3、1.5 和 1.6 would 所有数据都计算在同一个存储单元的频率上,从等于 1 的值到小于 2 的值。 + +![](img/df227f4f0633e237c734128d692274b0.jpg) + +请注意,一旦选择了箱大小,则箱的数量将由数据确定: + +如何选择最佳的仓宽没有硬性和快速性的规则。偶尔它会很明显(就像只有几个可能的值一样),但在许多情况下,它需要反复尝试。有一些方法试图找到一个最佳的仓位大小,例如在 r 的`nclass.FD()`函数中实现的 freedman diaconis 方法;我们将在下面的一些示例中使用该函数。 + +## 4.3 分布的理想化表示 + +数据集就像雪花,因为每一个都是不同的,但尽管如此,在不同类型的数据中经常会看到一些模式。这允许我们使用理想化的数据表示来进一步总结它们。让我们用[4.5](#fig:heightHistSep)中绘制的成人身高数据,并将它们与一个非常不同的变量一起绘制:脉率(每分钟心跳),也用 nhanes 测量(见图[4.6](#fig:NormalDistPlotsWithDist))。 + +![Histograms for height (left) and pulse (right) in the NHANES dataset, with the normal distribution overlaid for each dataset.](img/file11.png) + +图 4.6 nhanes 数据集中高度(左)和脉冲(右)的柱状图,每个数据集中的正态分布重叠。 + +虽然这些情节看起来不完全相同,但都具有在中间圆顶上相对对称的一般特征。这个形状实际上是我们收集数据时常见的分布形状之一,我们称之为 _ 正态 _(或 _ 高斯 _)分布。该分布由两个值(我们称之为分布的 _ 参数 _)定义:中心峰的位置(我们称之为 _ 平均值 _)和分布的宽度(用称为 _ 标准偏差的参数描述)。操作 _)。图[4.6](#fig:NormalDistPlotsWithDist)显示了在每个历史程序顶部绘制的适当正态分布。您可以看到,虽然曲线不完全符合数据,但它们在描述分布方面做得很好——只有两个数字! + +正如我们在后面的课程中讨论中心极限定理时所看到的,世界上许多变量呈现正态分布的形式有一个深刻的数学原因。 + +# + +## 4.3.1 偏斜度 + +图[4.6](#fig:NormalDistPlotsWithDist)中的例子很好地遵循正态分布,但在许多情况下,数据将以系统的方式偏离正态分布。数据可以偏离的一种方式是不对称的,这样分布的一个尾部比另一个更加密集。我们称之为“歪斜”。偏度通常发生在测量被限制为非负值的情况下,例如我们计算事物或测量经过的时间(因此变量不能取负值)。 + +斜率的一个例子可以在旧金山国际机场机场安全线的平均等待时间中看到,在图 [4.7 的左侧面板](#fig:SFOWaitTimes)中绘制。您可以看到,虽然大多数等待时间不到 20 分钟,但有许多情况下,它们会更长,超过 60 分钟!这是一个“右偏”分布的例子,其中右尾比左尾长;在查看计数或测量时间时,这些是常见的,不能小于零。看到“左偏”分布不太常见,但它们可能发生,例如,当查看不能取大于 1 的值的分数值时。 + +![Examples of right-skewed and long-tailed distributions. Left: Average wait times for security at SFO Terminal A (Jan-Oct 2017), obtained from https://awt.cbp.gov/ . Right: A histogram of the number of Facebook friends amongst 3,663 individuals, obtained from the Stanford Large Network Database. The person with the maximum number of friends is indicated by the blue dot.](img/file12.png) + +图 4.7 右偏和长尾分布示例。左:从[https://awt.cbp.gov/](https://awt.cbp.gov/)获取的 SFO 终端 A 安全的平均等待时间(2017 年 1-10 月)。右图:从斯坦福大型网络数据库中获取的 3663 个人中 Facebook 好友数量的柱状图。朋友最多的人用蓝点表示。 + +# + +## 4.3.2 长尾分布 + +历史上,统计数据主要集中在正态分布的数据上,但有许多数据类型看起来与正态分布完全不同。特别是,许多现实世界的分布是“长尾巴”,这意味着右尾巴远远超出了分布中最典型的成员。一种最有趣的数据类型,其中长尾分布发生在社会网络的分析。例如,让我们看看来自斯坦福大网络数据库[的 Facebook 好友数据,并绘制数据库中 3663 人的好友数量柱状图(参见图](https://snap.stanford.edu/data/egonets-Facebook.html)[4.7](#fig:SFOWaitTimes)的右面板)。如我们所见,这个分布有一个很长的右尾——一般人有 24.09 个朋友,而朋友最多的人(用蓝点表示)有 1043 个! + +在现实世界中,长尾分布越来越被认可。特别是,复杂系统的许多特征都具有这些分布特征,从文本中的单词频率,到进出机场的航班数量,再到大脑网络的连接。有许多不同的方法可以实现长尾分布,但在基督教圣经中所谓的“马太效应”的情况下会出现一个常见的方法: + +> 因为凡有更多的,必被赐给他,他也必富足;但没有的,连他所拥有的,也必被夺去。-马太福音 25:29,修订后的标准版 + +通常被解释为“富人越富有”。在这种情况下,优势是复合的,这样那些有更多朋友的人可以接触到更多的新朋友,而那些有更多钱的人可以做更多能增加他们财富的事情。 + +随着课程的发展,我们将看到一些长尾分布的例子,我们应该记住,当面对长尾数据时,统计中的许多工具可能会失败。正如纳西姆·尼古拉斯·塔勒布在其《黑天鹅》一书中指出的那样,这种长尾分布在 2008 年金融危机中起到了至关重要的作用,因为交易员使用的许多金融模型都假设金融系统将遵循正态分布,而他们显然没有遵循正态分布。 + +## 4.4 阅读建议 + +* _ 黑天鹅:纳西姆·尼古拉斯·塔勒布(Nassim Nicholas Taleb)的《极不可能的影响》(HTG1)_ \ No newline at end of file diff --git a/docs/4.x2.md b/docs/4.x2.md deleted file mode 100644 index 00fe8c3cce30d1c6524cac34c16d4e77469b74f5..0000000000000000000000000000000000000000 --- a/docs/4.x2.md +++ /dev/null @@ -1,298 +0,0 @@ -# 4 汇总数据 - -在本章中,我们将讨论为什么以及如何总结数据。 - -## 4.1 为什么要总结数据? - -当我们总结数据时,我们必然会丢弃信息,对此有许多可以想象的反对意见。作为一个例子,让我们回到我们在第 1 章中讨论的纯研究。除了数据集中总结的那些细节之外,我们是否不应该相信每个单独的事物的所有细节?关于如何收集数据的具体细节,如一天中的时间或参与者的心情,如何?当我们总结数据时,所有这些细节都会丢失。 - -我们一般总结数据,因为它为我们提供了一种概括 _ 的方法,也就是说,使一般性陈述超出特定的观察范围。作家豪尔赫·路易斯·博尔赫斯(JorgeLuisBorges)在其短篇小说《取笑记忆》(funes the memorious)中强调了概括的重要性,该小说描述了一个失去遗忘能力的人。博尔赫斯专注于归纳(即扔掉数据)和思考之间的关系:“思考就是忘记差异,归纳,抽象。在富丽堂皇的 funes 世界里,只有细节。”_ - -心理学家长期以来研究了归纳法对思维的核心作用。一个例子是分类:我们能够很容易地识别“鸟类”类别的不同例子,即使个别例子在表面特征上可能非常不同(例如鸵鸟、知更鸟和鸡)。重要的是,泛化可以让我们对这些个体做出预测——就鸟类而言,我们可以预测它们会飞和吃蠕虫,它们可能不会开车或说英语。这些预测并不总是正确的,但它们往往足够好,能够在世界上发挥作用。 - -## 4.2 使用表格汇总数据 - -总结数据的一个简单方法是生成一个表,表示各种类型观测的计数。这种类型的表已经使用了数千年(见图[4.1](#fig:salesContract))。 - -![A Sumerian tablet from the Louvre, showing a sales contract for a house and field. Public domain, via Wikimedia Commons.](img/file6.jpg) - -图 4.1 卢浮宫的苏美尔平板电脑,显示房屋和田地的销售合同。公共领域,通过维基共享资源。 - -让我们来看一些使用表的例子,同样使用 nhanes 数据集。在 rstudio 控制台中键入命令`help(NHANES)`,然后滚动查看帮助页面,如果使用 rstudio,该页面将在帮助面板中打开。此页提供有关数据集的一些信息以及数据集中包含的所有变量的列表。让我们来看一个简单的变量,在数据集中称为“physactive”。此变量包含三个不同值中的一个:“是”或“否”(指示此人是否报告正在进行“中等强度或剧烈强度的运动、健身或娱乐活动”),如果该个人缺少数据,则为“不”。有不同的原因导致数据丢失;例如,这一问题不是针对 12 岁以下的儿童提出的,而在其他情况下,成人可能在采访期间拒绝回答这个问题。 - -# - -## 4.2.1 频率分布 - -让我们看看每个类别中有多少人。现在不要担心 R 到底是怎么做的,我们稍后再谈。 - -```r -# summarize physical activity data - -PhysActive_table <- NHANES %>% - dplyr::select(PhysActive) %>% - group_by(PhysActive) %>% - summarize(AbsoluteFrequency = n()) - -pander(PhysActive_table) -``` - - -| 物理激活 | 绝对频率 | -| --- | --- | -| 不 | 2473 个 | -| 是的 | 2972 年 | -| 不适用 | 1334 年 | - -此单元格中的 r 代码生成一个表格,显示每个不同值的频率;有 2473 名回答“否”的人,2972 名回答“是”,1334 名没有回答。我们称之为 _ 频率分布 _,因为它告诉我们每个值是如何分布在样本中的。 - -因为我们只想与回答问题的人一起工作,所以让我们过滤数据集,使其只包括回答此问题的个人。 - -```r -# summarize physical activity data after dropping NA values using drop_na() - -NHANES %>% - drop_na(PhysActive) %>% - dplyr::select(PhysActive) %>% - group_by(PhysActive) %>% - summarize(AbsoluteFrequency = n()) %>% - pander() -``` - - -| PhysActive | AbsoluteFrequency | -| --- | --- | -| No | 2473 | -| Yes | 2972 | - -这向我们展示了两个响应的绝对频率,对于每个实际给出响应的人。从这一点上我们可以看出,说“是”的人比说“不”的人多,但从绝对数上很难分辨出差别有多大。因此,我们通常希望使用 _ 相对频率 _ 来呈现数据,该相对频率是通过将每个频率除以所有频率的和得到的: - -![](img/e4cafb8e8a9e4428a56a958889be4a26.jpg) - -在 R 中我们可以这样做,如下所示: - -```r -# compute relative frequency of physical activity categories - -NHANES %>% - drop_na(PhysActive) %>% - dplyr::select(PhysActive) %>% - group_by(PhysActive) %>% - summarize(AbsoluteFrequency = n()) %>% - mutate(RelativeFrequency = AbsoluteFrequency / sum(AbsoluteFrequency)) %>% - pander() -``` - - -| PhysActive | AbsoluteFrequency | 相对频率 | -| --- | --- | --- | -| No | 2473 | 0.454 个 | -| Yes | 2972 | 0.546 个 | - -相对频率提供了一种更简单的方法来判断不平衡的程度。我们还可以通过将相对频率乘以 100 来将其解释为百分比: - -```r -# compute percentages for physical activity categories - -PhysActive_table_filtered <- NHANES %>% - drop_na(PhysActive) %>% - dplyr::select(PhysActive) %>% - group_by(PhysActive) %>% - summarize(AbsoluteFrequency = n()) %>% - mutate( - RelativeFrequency = AbsoluteFrequency / sum(AbsoluteFrequency), - Percentage = RelativeFrequency * 100 - ) - -pander(PhysActive_table_filtered) -``` - - -| PhysActive | AbsoluteFrequency | RelativeFrequency | 百分比 | -| --- | --- | --- | --- | -| No | 2473 | 0.454 | 45.418 美元 | -| Yes | 2972 | 0.546 | 54.582 条 | - -这让我们看到,NHANES 样本中 45.42%的人说“不”,54.58%的人说“是”。 - -# - -## 4.2.2 累积分布 - -我们在上面研究的 physactive 变量只有两个可能的值,但我们通常希望总结出可以有更多可能值的数据。当这些值至少是序数时,总结它们的一个有用方法是通过我们所称的 _ 累积 _ 频率表示:我们不询问对特定值进行多少观察,而是询问有多少个值至少是 _ 某个特定值。_ - -让我们看一下 nhanes 数据集中的另一个变量,名为 sleephrsnight,它记录了参与者在正常工作日报告睡眠的时间。让我们像上面一样创建一个频率表,在删除了没有对问题作出响应的任何人之后。 - -```r -# create summary table for relative frequency of different -# values of SleepHrsNight - -NHANES %>% - drop_na(SleepHrsNight) %>% - dplyr::select(SleepHrsNight) %>% - group_by(SleepHrsNight) %>% - summarize(AbsoluteFrequency = n()) %>% - mutate( - RelativeFrequency = AbsoluteFrequency / sum(AbsoluteFrequency), - Percentage = RelativeFrequency * 100 - ) %>% - pander() -``` - - -| 睡眠之光 | AbsoluteFrequency | RelativeFrequency | Percentage | -| --- | --- | --- | --- | -| 二 | 9 | 0.002 个 | 0.179 个 | -| 三 | 49 岁 | 0.01 分 | 0.973 个 | -| 4 | 200 个 | 0.04 分 | 3.972 年 | -| 5 个 | 406 个 | 0.081 个 | 8.064 年 | -| 6 | 1172 年 | 0.233 个 | 23.277 页 | -| 7 | 1394 年 | 0.277 个 | 27.686 年 | -| 8 个 | 1405 年 | 0.279 个 | 27.905 年 | -| 9 | 271 个 | 0.054 个 | 5.382 条 | -| 10 个 | 97 | 0.019 个 | 1.927 个 | -| 11 个 | 15 个 | 0.003 个 | 0.298 个 | -| 12 个 | 17 | 0.003 | 0.338 个 | - -我们可以通过查看表开始汇总数据集;例如,我们可以看到大多数人报告睡眠时间在 6 到 8 小时之间。让我们绘制数据以更清楚地看到这一点。要做到这一点,我们可以绘制一个 _ 柱状图 _,它显示具有每个不同值的事例数;请参见图[4.2](#fig:sleepHist)的左面板。ggplot2()库有一个内置的柱状图函数(`geom_histogram()`),我们经常使用它。我们还可以绘制相对频率,我们通常将其称为 _ 密度 _——参见图[4.2](#fig:sleepHist)的右面板。 - -![Left: Histogram showing the number (left) and proportion (right) of people reporting each possible value of the SleepHrsNight variable.](img/file7.png) - -图 4.2 左:显示报告 sleephrsnight 变量每个可能值的人数(左)和比例(右)的柱状图。 - -如果我们想知道有多少人报告睡眠 5 小时或更少怎么办?为了找到这个,我们可以计算一个 _ 累积分布 _: - -![](img/ff7ab633040472ac2bce1842214d5049.jpg) - -也就是说,为了计算某个值 j 的累积频率,我们将所有值(包括 j)的频率相加。让我们对睡眠变量进行计算,首先对绝对频率进行计算: - -```r -# create cumulative frequency distribution of SleepHrsNight data - -SleepHrsNight_cumulative <- - NHANES %>% - drop_na(SleepHrsNight) %>% - dplyr::select(SleepHrsNight) %>% - group_by(SleepHrsNight) %>% - summarize(AbsoluteFrequency = n()) %>% - mutate(CumulativeFrequency = cumsum(AbsoluteFrequency)) - -pander(SleepHrsNight_cumulative) -``` - - -| SleepHrsNight | AbsoluteFrequency | 累积频率 | -| --- | --- | --- | -| 2 | 9 | 9 | -| 3 | 49 | 58 | -| 4 | 200 | 258 个 | -| 5 | 406 | 664 个 | -| 6 | 1172 | 1836 年 | -| 7 | 1394 | 3230 个 | -| 8 | 1405 | 4635 个 | -| 9 | 271 | 4906 个 | -| 10 | 97 | 5003 个 | -| 11 | 15 | 5018 年 | -| 12 | 17 | 5035 个 | - -在图[4.3](#fig:sleepAbsCumulRelFreq)的左侧面板中,我们绘制了数据,以查看这些表示形式的外观;绝对频率值以红色绘制,累积频率以蓝色绘制。我们看到累积频率是单调递增的,也就是说,它只能上升或保持不变,但不能下降。同样,我们通常发现相对频率比绝对频率更有用;这些频率绘制在图[4.3](#fig:sleepAbsCumulRelFreq)的右面板中。 - -![A plot of the relative (red) and cumulative relative (blue) values for frequency (left) and proportion (right) for the possible values of SleepHrsNight.](img/file8.png) - -图 4.3 SleephrsNight 可能值的频率(左)和比例(右)的相对(红)和累积相对(蓝)值的图。 - -# - -## 4.2.3 绘制柱状图 - -![A histogram of the Age (left) and Height (right) variables in NHANES.](img/file9.png) - -图 4.4 nhanes 中年龄(左)和身高(右)变量的柱状图。 - -我们在上面研究的变量相当简单,只有几个可能的值。现在让我们来看一个更复杂的变量:年龄。首先,让我们绘制 nhanes 数据集中所有个体的年龄变量(参见图[4.4](#fig:ageHist)的左面板)。你看到了什么?首先,你应该注意到每个年龄组的个体数量随着时间的推移而减少。这是有道理的,因为人口是随机抽样的,因此随着时间的推移死亡导致老年人的数量减少。其次,你可能在 80 岁的时候注意到图表中有一个大的尖峰。你觉得这是怎么回事? - -如果您查看 nhanes 数据集的帮助功能,您将看到以下定义:“研究参与者筛选的年龄(年)。注:80 岁或 80 岁以上的受试者被记录为 80 岁。“原因在于,年龄很高的受试者数量相对较少,如果你知道他们的确切年龄,就可能更容易在数据集中识别出特定的人;研究人员通常承诺他们的参与蚂蚁要对自己的身份保密,这是他们能做的有助于保护研究对象的事情之一。这也突显了一个事实,即知道一个人的数据来自何处以及如何处理它们总是很重要的;否则,我们可能会不正确地解释它们。 - -让我们看看 nhanes 数据集中另一个更复杂的变量:高度。高度值的柱状图绘制在图[4.4](#fig:ageHist)的右面板中。关于这个分布你首先应该注意的是,它的大部分密度集中在 170 厘米左右,但是分布的左侧有一个“尾巴”;有少数个体的高度要小得多。你觉得这是怎么回事? - -您可能已经直觉到小高度来自数据集中的子级。检查这一点的一种方法是为儿童和成人绘制单独颜色的柱状图(图[4.5](#fig:heightHistSep)的左面板)。这表明,所有非常短的高度确实来自样本中的儿童。让我们创建一个新版本的 nhanes,它只包含成年人,然后为他们绘制柱状图(图[4.5](#fig:heightHistSep)的右面板)。在这个图中,分布看起来更加对称。正如我们稍后将看到的,这是一个 _ 正态 _(或 _ 高斯 _)分布的很好例子。 - -![Histogram of heights for NHANES. A: values plotted separately for children (blue) and adults (red). B: values for adults only. C: Same as B, but with bin width = 0.1](img/file10.png) - -图 4.5 nhanes 高度柱状图。A:分别为儿童(蓝色)和成人(红色)绘制的值。B:仅限成人使用。C:与 B 相同,但仓宽=0.1 - -# - -## 4.2.4 柱状图箱 - -在我们前面使用睡眠变量的例子中,数据是以整数报告的,我们只计算报告每个可能值的人数。但是,如果您查看 nhanes 中高度变量的一些值,您将看到它是以厘米为单位测量的,一直到小数点后一位: - -```r -# take a slice of a few values from the full data frame -NHANES_adult %>% - dplyr::select(Height) %>% - slice(45:50) %>% - pander() -``` - - -| 高度 | -| --- | -| 169.6 条 | -| 169.8 条 | -| 167.5 条 | -| 155.2 条 | -| 173.8 条 | -| 174.5 条 | - -图[4.5](#fig:heightHistSep)的面板 C 显示了统计每个可能值的密度的直方图。这个柱状图看起来真的参差不齐,这是因为特定的小数位值的可变性。例如,值 173.2 出现 32 次,而值 173.3 只出现 15 次。我们可能不认为这两个权重的流行率真的有如此大的差异;更可能的原因是我们的样本中的随机变异性。 - -一般来说,当我们创建一个连续的或可能有很多值的数据柱状图时,我们将 _bin_ 这些值,这样我们就不会计算和绘制每个特定值的频率,而是计算和绘制特定范围内的值的频率。e.这就是为什么上面[4.5](#fig:heightHistSep)的面板 B 中的图看起来不那么锯齿状的原因;如果您查看`geom_histogram`命令,您将看到我们设置了“b in width=1”,它告诉命令通过将 b in 中的值与宽度为 1 的值组合来计算柱状图;因此,值 1.3、1.5 和 1.6 would 所有数据都计算在同一个存储单元的频率上,从等于 1 的值到小于 2 的值。 - -![](img/df227f4f0633e237c734128d692274b0.jpg) - -请注意,一旦选择了箱大小,则箱的数量将由数据确定: - -如何选择最佳的仓宽没有硬性和快速性的规则。偶尔它会很明显(就像只有几个可能的值一样),但在许多情况下,它需要反复尝试。有一些方法试图找到一个最佳的仓位大小,例如在 r 的`nclass.FD()`函数中实现的 freedman diaconis 方法;我们将在下面的一些示例中使用该函数。 - -## 4.3 分布的理想化表示 - -数据集就像雪花,因为每一个都是不同的,但尽管如此,在不同类型的数据中经常会看到一些模式。这允许我们使用理想化的数据表示来进一步总结它们。让我们用[4.5](#fig:heightHistSep)中绘制的成人身高数据,并将它们与一个非常不同的变量一起绘制:脉率(每分钟心跳),也用 nhanes 测量(见图[4.6](#fig:NormalDistPlotsWithDist))。 - -![Histograms for height (left) and pulse (right) in the NHANES dataset, with the normal distribution overlaid for each dataset.](img/file11.png) - -图 4.6 nhanes 数据集中高度(左)和脉冲(右)的柱状图,每个数据集中的正态分布重叠。 - -虽然这些情节看起来不完全相同,但都具有在中间圆顶上相对对称的一般特征。这个形状实际上是我们收集数据时常见的分布形状之一,我们称之为 _ 正态 _(或 _ 高斯 _)分布。该分布由两个值(我们称之为分布的 _ 参数 _)定义:中心峰的位置(我们称之为 _ 平均值 _)和分布的宽度(用称为 _ 标准偏差的参数描述)。操作 _)。图[4.6](#fig:NormalDistPlotsWithDist)显示了在每个历史程序顶部绘制的适当正态分布。您可以看到,虽然曲线不完全符合数据,但它们在描述分布方面做得很好——只有两个数字! - -正如我们在后面的课程中讨论中心极限定理时所看到的,世界上许多变量呈现正态分布的形式有一个深刻的数学原因。 - -# - -## 4.3.1 偏斜度 - -图[4.6](#fig:NormalDistPlotsWithDist)中的例子很好地遵循正态分布,但在许多情况下,数据将以系统的方式偏离正态分布。数据可以偏离的一种方式是不对称的,这样分布的一个尾部比另一个更加密集。我们称之为“歪斜”。偏度通常发生在测量被限制为非负值的情况下,例如我们计算事物或测量经过的时间(因此变量不能取负值)。 - -斜率的一个例子可以在旧金山国际机场机场安全线的平均等待时间中看到,在图 [4.7 的左侧面板](#fig:SFOWaitTimes)中绘制。您可以看到,虽然大多数等待时间不到 20 分钟,但有许多情况下,它们会更长,超过 60 分钟!这是一个“右偏”分布的例子,其中右尾比左尾长;在查看计数或测量时间时,这些是常见的,不能小于零。看到“左偏”分布不太常见,但它们可能发生,例如,当查看不能取大于 1 的值的分数值时。 - -![Examples of right-skewed and long-tailed distributions. Left: Average wait times for security at SFO Terminal A (Jan-Oct 2017), obtained from https://awt.cbp.gov/ . Right: A histogram of the number of Facebook friends amongst 3,663 individuals, obtained from the Stanford Large Network Database. The person with the maximum number of friends is indicated by the blue dot.](img/file12.png) - -图 4.7 右偏和长尾分布示例。左:从[https://awt.cbp.gov/](https://awt.cbp.gov/)获取的 SFO 终端 A 安全的平均等待时间(2017 年 1-10 月)。右图:从斯坦福大型网络数据库中获取的 3663 个人中 Facebook 好友数量的柱状图。朋友最多的人用蓝点表示。 - -# - -## 4.3.2 长尾分布 - -历史上,统计数据主要集中在正态分布的数据上,但有许多数据类型看起来与正态分布完全不同。特别是,许多现实世界的分布是“长尾巴”,这意味着右尾巴远远超出了分布中最典型的成员。一种最有趣的数据类型,其中长尾分布发生在社会网络的分析。例如,让我们看看来自斯坦福大网络数据库[的 Facebook 好友数据,并绘制数据库中 3663 人的好友数量柱状图(参见图](https://snap.stanford.edu/data/egonets-Facebook.html)[4.7](#fig:SFOWaitTimes)的右面板)。如我们所见,这个分布有一个很长的右尾——一般人有 24.09 个朋友,而朋友最多的人(用蓝点表示)有 1043 个! - -在现实世界中,长尾分布越来越被认可。特别是,复杂系统的许多特征都具有这些分布特征,从文本中的单词频率,到进出机场的航班数量,再到大脑网络的连接。有许多不同的方法可以实现长尾分布,但在基督教圣经中所谓的“马太效应”的情况下会出现一个常见的方法: - -> 因为凡有更多的,必被赐给他,他也必富足;但没有的,连他所拥有的,也必被夺去。-马太福音 25:29,修订后的标准版 - -通常被解释为“富人越富有”。在这种情况下,优势是复合的,这样那些有更多朋友的人可以接触到更多的新朋友,而那些有更多钱的人可以做更多能增加他们财富的事情。 - -随着课程的发展,我们将看到一些长尾分布的例子,我们应该记住,当面对长尾数据时,统计中的许多工具可能会失败。正如纳西姆·尼古拉斯·塔勒布在其《黑天鹅》一书中指出的那样,这种长尾分布在 2008 年金融危机中起到了至关重要的作用,因为交易员使用的许多金融模型都假设金融系统将遵循正态分布,而他们显然没有遵循正态分布。 - -## 4.4 阅读建议 - -* _ 黑天鹅:纳西姆·尼古拉斯·塔勒布(Nassim Nicholas Taleb)的《极不可能的影响》(HTG1)_ \ No newline at end of file diff --git a/docs/5.md b/docs/5.md index 1a0789dc75419e638e11af845555e2f28cbf91e4..27a894de9d1fa3531e5e3a50b686fbce515c3636 100644 --- a/docs/5.md +++ b/docs/5.md @@ -1,3 +1,739 @@ # 5 将模型拟合到数据 -统计学中的一个基本活动是创建可以使用一组小数字汇总数据的模型,从而提供对数据的简洁描述。在本章中,我们将讨论统计模型的概念以及如何使用它来描述数据。 \ No newline at end of file +统计学中的一个基本活动是创建可以使用一组小数字汇总数据的模型,从而提供对数据的简洁描述。在本章中,我们将讨论统计模型的概念以及如何使用它来描述数据。 + +## 5.1 什么是模型? + +在物理世界中,“模型”通常是对现实世界中事物的简化,尽管如此,它还是传达了被建模事物的本质。建筑物的模型传递建筑物的结构,同时又小又轻,足以用手拿起;生物学中的细胞模型比实际物体大得多,但又传递了细胞的主要部分及其关系。 + +在统计学中,模型的目的是提供一个类似的简明描述,但用于数据而不是物理结构。与物理模型一样,统计模型通常比所描述的数据简单得多;它旨在尽可能简单地捕获数据的结构。在这两种情况下,我们都意识到,模型是一种方便的虚构,它必然掩盖了被建模的实际事物的一些细节。正如统计学家乔治博克斯所说:“所有的模型都是错误的,但有些模型是有用的。” + +统计模型的基本结构是: + +![](img/0c021ca249df797a2c6e689f7616f5a3.jpg) + +这表明数据可以用一个统计模型来描述,这个模型描述了我们期望在数据中发生的事情,以及模型和数据之间的差异,我们称之为 _ 错误 _。 + +## 5.2 统计建模:示例 + +让我们来看一个使用 nhanes 中的数据将模型拟合到数据的示例。特别是,我们将尝试在 nhanes 样本中建立儿童身高的模型。首先,让我们加载数据并绘制它们(参见图[5.1](#fig:childHeight))。 + +![Histogram of height of children in NHANES.](img/file13.png) + +图 5.1 NHANES 儿童身高柱状图。 + +请记住,我们希望尽可能简单地描述数据,同时仍然捕获它们的重要特性。我们能想象的最简单的模型是什么,它仍然能够捕获数据的本质?数据集中最常见的值(我们称之为 _ 模式 _)如何?R 没有内置的模式函数,所以我们将首先创建一个,我们称之为`getmode()`。 + +```r +# create function to compute mode and apply to child height data from NHANES +getmode <- function(v) { + uniqv <- unique(v) + return(uniqv[which.max(tabulate(match(v, uniqv)))]) +} + +height_mode <- getmode(NHANES_child$Height) + +paste("mode of children's height from NHANES:", height_mode) +``` + +```r +## [1] "mode of children's height from NHANES: 166.5" +``` + +鉴于此,我们针对单个数据点![](img/31df9c730e19ca29b59dce64b99d98c1.jpg)的模型将是: + +![](img/8f1a8d16a7bccf2f8932fa75c5d9486b.jpg) + +这就用一个数字重新定义了 1691 个孩子的整个集合,如果我们想预测任何一个新孩子的身高,那么我们的猜测将是相同的数字:166.5 厘米。 + +这个模型有多好?一般来说,我们用误差来定义模型的优度,它代表了模型和数据之间的差异;所有事物都是相等的,产生较低误差的模型就是更好的模型。 + +```r +# compute error compared to the mode and plot histogram + +error_mode <- NHANES_child$Height - height_mode +sprintf("average error from mode (cm): %0.2f", mean(error_mode)) +``` + +```r +## [1] "average error from mode (cm): -28.80" +``` + +我们发现平均个体的误差相当大,为-28.8 厘米。我们想要一个平均误差为零的模型,结果是如果我们使用算术平均值(通常称为 _ 平均值 _)作为我们的模型,那么情况就是这样。 + +平均值(通常用变量上的条表示,如![](img/17ee279e0e3562706ec890e1da87b839.jpg))定义为: + +![](img/5b53c23c73ac1d477dfe58135c39125b.jpg) + +也就是说,它是所有值的总和,除以值的数目。我们可以证明平均误差(因此平均误差)之和为零: + +![](img/58242f7f4f1e470a16a6c033ab66e6e0.jpg) + +![](img/a3c6e3addb29d9306b8debc2d55ef696.jpg) + +![](img/cc05829e6579c35a8c07658c455c5cc7.jpg) + +![](img/40c761930ed69a3d87b3e8efef7a60f2.jpg) + +![](img/29d5b7dc9f47275015354d5507b398f8.jpg) + +考虑到平均误差为零,这似乎是一个更好的模型。让我们确认一下它是正确的。 + +```r +# compute error from mean + +error_mean <- NHANES_child$Height - mean(NHANES_child$Height) +sprintf("average error for mean (cm): %e", mean(error_mean)) +``` + +```r +## [1] "average error for mean (cm): -9.864171e-15" +``` + +![Distribution of errors from the mean.](img/file14.png) + +图 5.2 平均值误差分布。 + +这里的平均误差是一个非常小的数字,虽然技术上不是零;我们稍后将在课程中讨论为什么会发生这种情况(这是由于计算机如何表示数字),但现在您可以将其视为接近零,称之为零。 + +尽管平均误差的平均值为零,但从图[5.2](#fig:meanError)中的柱状图可以看出,每个个体仍然存在一定程度的误差;有些是正的,有些是负的,而这些误差相互抵消。出于这个原因,我们通常用某种将正错误和负错误都算作坏的度量来总结错误。我们可以使用每个误差值的绝对值,但更常见的是使用平方误差,这是我们将在本课程后面看到的原因。 + +有几种常见的方法来总结在本书的不同点上会遇到的平方误差,因此了解它们之间的关系是很重要的。首先,我们可以简单地把它们加起来;这被称为 _ 平方误差之和 _。我们通常不使用它的原因是它的大小取决于数据点的数量,所以除非我们观察相同数量的观测结果,否则很难解释。其次,我们可以取平方误差值的平均值,即 _ 平均平方误差(mse)_。但是,由于我们在求平均值之前对这些值进行了平方处理,因此它们与原始数据的比例不同;它们位于![](img/b76fa8e9240baa1b063fdb1b291014ef.jpg)中。由于这个原因,我们也经常采用 mse 的平方根,我们称之为 _ 均方根误差(rmse)_,因此它与原始值的单位相同(在本例中为厘米)。 + +```r +# compute and print RMSE for mean and mode +rmse_mean <- sqrt(mean(error_mean**2)) + +rmse_mode <- sqrt(mean(error_mode**2)) + +print(paste("Mode: root mean squared error (centimeters):", rmse_mode)) +``` + +```r +## [1] "Mode: root mean squared error (centimeters): 39.4197926582947" +``` + +```r +print(paste("Mean: root mean squared error (centimeters):", rmse_mean)) +``` + +```r +## [1] "Mean: root mean squared error (centimeters): 26.9116738708646" +``` + +这表明平均值有相当大的误差——任何数据点平均距离平均值大约 27 厘米——但它仍然比模式好得多。 + +# + +## 5.2.1 改进我们的模型 + +我们能想象一个更好的模型吗?请记住,这些数据来自 NHANES 样本中的所有儿童,他们的年龄从 2 岁到 17 岁不等。鉴于年龄范围很广,我们可能期望我们的身高模型也包括年龄。让我们绘制身高和年龄的数据,看看这种关系是否真的存在。 + +![Height of children in NHANES, plotted without a model (A), with a linear model including only age (B) or age and a constant (C), and with a linear model that fits separate effects of age for males and females (D).](img/file15.png) + +图 5.3 NHANES 儿童的身高,未使用模型(a)绘制,线性模型仅包括年龄(b)或年龄和常数(c),线性模型适合男性和女性年龄的单独影响(d)。 + +图[5.3](#fig:childHeightLine)的面板 A 中的黑点显示了数据集中的个体,正如我们所期望的,身高和年龄之间似乎有着很强的关系。因此,我们可以建立一个高度与年龄相关的模型: + +![](img/c717cebcba3f84002e2514ee52151fcf.jpg) + +其中![](img/50705df736e9a7919e768cf8c4e4f794.jpg)是一个 _ 参数 _,我们用年龄相乘得到最小的误差。您可能已经注意到,这只是一条斜率为![](img/50705df736e9a7919e768cf8c4e4f794.jpg)的直线,为了看到这一点,让我们在数据顶部用蓝色绘制出最适合的直线(图[5.3](#fig:childHeightLine)中的面板 B)。这个模型显然有问题,因为这条线似乎没有很好地跟踪数据。事实上,这个模型(39.16)的 RMSE 实际上比只包含平均值的模型高!这个问题是因为我们的模型只包括年龄,这意味着当年龄为零时,模型的高度预测值必须为零。即使数据不包括任何年龄为零的子代,但当 x 为零时,该行在数学上被限制为 Y 值为零,这就解释了为什么该行被下拉到较年轻的数据点之下。我们可以通过在我们的模型中包含一个常量来解决这个问题,它基本上代表年龄等于零时高度的估计值;尽管在这个数据集中零岁的年龄是不合理的,但这是一个数学技巧,它将允许模型解释数据。模型为: + +![](img/5f3c8825cfc704e26a0eefeb99111407.jpg) + +其中 _ 常数 _ 是对所有个体的预测增加的一个常量值(我们也称为 _ 截距 _,因为它映射到一条直线方程中的截距上)。稍后我们还将了解如何实际计算这些值;现在,我们将使用 r 中的`lm()`函数计算常量的值,并使用![](img/50705df736e9a7919e768cf8c4e4f794.jpg)计算出最小的错误。图[5.3](#fig:childHeightLine)中的面板 C 显示了适合于 nhanes 数据的该模型,在该模型中,我们看到线条与数据的匹配比没有常量的要好得多。 + +```r +## [1] "model: height = 86.11 + 5.48*Age" +``` + +```r +## [1] "root mean squared error: 8.36" +``` + +使用这个模型,我们的误差要小得多——平均只有 8.36 厘米。你能想到其他可能与身高有关的变量吗?性别呢?在图[5.3](#fig:childHeightLine)的面板 D 中,我们用分别为男性和女性安装的线条绘制数据。从情节上看,男性和女性之间似乎存在差异,但相对较小,仅在青春期后出现。让我们估计一下这个模型,看看错误是什么样子的: + +```r +# compute model fit for modeling with age and gender + +model_age_gender <- lm(Height ~ Age + Gender, data = NHANES_child) + +rmse_age_gender <- + NHANES_child %>% + add_predictions(model_age_gender, var = "predicted_age_gender") %>% + summarise( + sqrt(mean((Height - predicted_age_gender)**2)) + ) %>% + pull() + +sprintf( + "model: height = %0.2f + %0.2f*Age + %0.2f*Gender", + model_age_gender$coefficients[1], + model_age_gender$coefficients[2], + model_age_gender$coefficients[3] +) +``` + +```r +## [1] "model: height = 84.37 + 5.48*Age + 3.28*Gender" +``` + +```r +print(sprintf("root mean squared error: %0.2f", rmse_age_gender)) +``` + +```r +## [1] "root mean squared error: 8.20" +``` + +在图[5.4](#fig:msePlot)中,我们绘制了不同模型的均方根误差值。从这一点上,我们可以看到,从一种模式到另一种模式,从一种模式到另一种模式,从一种模式到另一种模式再到另一种模式+年龄,这个模式变得更好了一点,而且只通过将性别也包括在内,就可以说更好了。 + +![Mean squared error plotted for each of the models tested above.](img/file16.png) + +图 5.4 为上述测试的每个模型绘制的均方误差。 + +## 5.3 什么使模型“良好”? + +从我们的统计模型中,我们通常需要两种不同的东西。首先,我们希望它能够很好地描述我们的数据;也就是说,我们希望它在建模数据时具有尽可能低的错误。第二,我们希望它能够很好地概括为新的数据集;也就是说,当我们将其应用于新的数据集时,我们希望它的错误尽可能低。事实证明,这两个特性经常会发生冲突。 + +为了理解这一点,让我们考虑一下错误的来源。首先,如果我们的模型是错误的,就可能发生这种情况;例如,如果我们不准确地说身高随年龄而下降而不是上升,那么我们的错误将高于正确模型的错误。同样,如果我们的模型中缺少一个重要因素,这也会增加我们的误差(就像我们把年龄从模型中排除在身高之外时那样)。然而,即使模型是正确的,误差也可能发生,因为数据的随机变化,我们通常称之为“测量误差”或“噪声”。有时,这实际上是由于我们的测量误差造成的——例如,当测量值依赖于人时,例如使用秒表测量竞走中经过的时间。在其他情况下,我们的测量设备是高度精确的(像测量体重的数字秤),但被测量的东西受到许多不同因素的影响,这些因素导致它是可变的。如果我们知道所有这些因素,那么我们就可以建立一个更精确的模型,但事实上,这几乎不可能。 + +让我们用一个例子来说明这一点。我们不使用实际数据,而是为示例生成一些数据;我们将在本课程后面更详细地讨论模拟数据的生成。假设我们想了解一个人的血液酒精含量(BAC)和他们在模拟驾驶考试中的反应时间之间的关系。我们可以生成一些模拟数据并绘制关系图(参见图[5.5](#fig:BACrt)的面板 A)。 + +![Simulated relationship between blood alcohol content and reaction time on a driving test, with best-fitting linear model. A: linear relationship with low measurement error. B: linear relationship with higher measurement error. C: Nonlinear relationship with low measurement error and (incorrect) linear model](img/file17.png) + +图 5.5 驾驶试验中血液酒精含量与反应时间的模拟关系,最佳拟合线性模型。A:线性关系,测量误差小。B:线性关系,测量误差较大。C:具有低测量误差和(不正确)线性模型的非线性关系 + +在这个例子中,反应时间随血液中的酒精含量而有系统地增加——蓝线表示最合适的模型,我们可以看到误差很小,这很明显,所有的点都非常接近这条线。 + +我们也可以想象数据显示相同的线性关系,但有更多的误差,如图[5.5](#fig:BACrt)的面板 B 所示。在这里,我们看到仍然有一个系统的反应时间增加与细菌,但它是更多的个人变量。 + +这两个例子都是 _ 线性模型 _ 似乎合适的,并且误差反映了我们测量中的噪声。线性模型规定两个变量之间的关系遵循直线。例如,在线性模型中,无论 BAC 的级别如何,BAC 的变化总是与反应时间的特定变化相关。 + +另一方面,还有其他情况下线性模型是不正确的,并且由于没有正确地指定模型,误差会增加。假设我们对咖啡因摄入量和测试表现之间的关系感兴趣。咖啡因等兴奋剂与测试成绩之间的关系往往是非线性的,也就是说,它不遵循直线。这是因为随着咖啡因含量的减少(当这个人变得更加警觉时),工作表现也会随之上升,但随着咖啡因含量的增加(当这个人变得紧张和紧张时),工作表现也会开始下降。我们可以模拟这种形式的数据,然后将线性模型拟合到数据中(参见图[5.5](#fig:BACrt)的面板 C)。蓝线表示最符合这些数据的直线;显然,存在高度错误。虽然在测试表现和咖啡因摄入量之间有着非常合法的关系,但它是一条曲线而不是一条直线。线性模型误差很大,因为它是这些数据的错误模型。 + +## 5.4 模型是否太好? + +错误听起来像是一件坏事,通常我们更喜欢误差较低的模型,而不是误差较高的模型。然而,我们在上面提到,在模型精确地适应当前数据集的能力和它概括为新数据集的能力之间存在着一种张力,并且结果表明,误差最小的模型在概括为新数据集时往往更糟糕! + +为了看到这一点,让我们再次生成一些数据,以便我们知道变量之间的真正关系。我们将创建两个模拟数据集,它们以完全相同的方式生成——它们只是添加了不同的随机噪声。 + +![An example of overfitting. Both datasets were generated using the same model, with different random noise added to generate each set. The left panel shows the data used to fit the model, with a simple linear fit in blue and a complex (8th order polynomial) fit in red. The root mean square error values for each model are shown in the figure; in this case, the complex model has a lower RMSE than the simple model. The right panel shows the second dataset, with the same model overlaid on it and the RMSE values computed using the model obtained from the first dataset. Here we see that the simpler model actually fits the new dataset better than the more complex model, which was overfitted to the first dataset.](img/file18.png) + +图 5.6 过拟合示例。两个数据集都是使用相同的模型生成的,每个数据集都添加了不同的随机噪声。左面板显示了用于拟合模型的数据,简单的蓝色线性拟合和复杂的(8 阶多项式)红色拟合。每个模型的均方根误差值如图所示;在这种情况下,复杂模型的 RMSE 比简单模型低。右面板显示了第二个数据集,上面覆盖了相同的模型,并且使用从第一个数据集获得的模型计算了 RMSE 值。在这里,我们看到更简单的模型实际上比更复杂的模型更适合新的数据集,后者过度适合第一个数据集。 + +图[5.6](#fig:Overfitting)中的左面板显示,更复杂的模型(红色)比简单的模型(蓝色)更适合数据。然而,当相同的模型应用于以相同方式生成的新数据集时,我们看到了相反的情况——这里我们看到,较简单的模型比较复杂的模型更适合新数据。从直观上看,较复杂的模型受第一个数据集中特定数据点的影响较大;由于这些数据点的确切位置受随机噪声的驱动,导致较复杂的模型很难适应新的数据集。这是一个我们称之为 _ 过拟合 _ 的现象,我们将在本课程中反复讨论。稍后,我们将学习一些技术,我们可以使用这些技术来防止过度拟合,同时仍然对数据结构敏感。现在,重要的是要记住,我们的模型适合需要是好的,但不是太好。正如阿尔伯特爱因斯坦(1933)所说:“几乎不能否认,所有理论的最高目标是使不可约的基本要素尽可能简单和少,而不必放弃对单一经验数据的充分表示。”这通常被解释为:“一切应该尽可能简单,但不能简单。” + +## 5.5 最简单的模型:平均值 + +我们已经遇到了平均值(或平均值),事实上,大多数人知道平均值,即使他们从未上过统计课。它通常用来描述我们称之为数据集“中心趋势”的东西——也就是说,数据以什么值为中心?大多数人不认为计算平均值是将模型与数据相匹配。然而,这正是我们计算平均值时要做的。 + +我们已经看到了计算数据样本平均值的公式: + +![](img/5b53c23c73ac1d477dfe58135c39125b.jpg) + +注意,我说过这个公式是专门针对数据的 _ 样本 _ 的,它是从更大的人群中选择的一组数据点。我们希望通过一个样本来描述一个更大的群体——我们感兴趣的全套个体。例如,如果我们是一个政治民意测验者,我们感兴趣的人群可能都是注册选民,而我们的样本可能只包括从这个人群中抽取的几千人。在本课程的后面,我们将更详细地讨论抽样,但现在重要的一点是统计学家通常喜欢使用不同的符号来区分描述样本值的统计数据和描述总体值的参数;在这种情况下,公式 a 表示总体平均值(表示为![](img/4e4d506c887c843f43a8fbcbe1884ffd.jpg))为: + +![](img/31b706b8ff77ab1267e8325dd64b1954.jpg) + +其中 n 是整个人口的大小。 + +我们已经看到,平均值是保证给我们的平均误差为零的汇总统计。平均值还有另一个特点:它是最小化平方误差总和(SSE)的汇总统计。在统计学中,我们称之为“最佳”估计量。我们可以从数学上证明这一点,但我们将在图[5.7](#fig:MinSSE)中以图形方式证明这一点。 + +![A demonstration of the mean as the statistic that minimizes the sum of squared errors. Using the NHANES child height data, we compute the mean (denoted by the blue bar). Then, we test a range of other values, and for each one we compute the sum of squared errors for each data point from that value, which are denoted by the black curve. We see that the mean falls at the minimum of the squared error plot.](img/file19.png) + +图 5.7 平均值作为统计值的证明,可使平方误差之和最小化。使用 nhanes 子高度数据,我们计算平均值(用蓝色条表示)。然后,我们测试其他值的范围,对于每个值,我们从该值计算每个数据点的平方误差之和,该值由黑色曲线表示。我们看到平均值降到平方误差图的最小值。 + +SSE 的最小化是一个很好的特性,这就是为什么平均值是最常用的统计数据汇总。然而,均值也有一个阴暗面。假设一个酒吧有五个人,我们检查每个人的收入: + +```r +# create income data frame + +incomeDf <- + tibble( + income = c(48000, 64000, 58000, 72000, 66000), + person = c("Joe", "Karen", "Mark", "Andrea", "Pat") +) +# glimpse(incomeDf) + +panderOptions('digits',2) +pander(incomeDf) +``` + + +| 收入 | 人 | +| --- | --- | +| 48000 个 | 乔 | +| 64000 个 | 凯伦 | +| 5.8 万 | 作记号 | +| 72000 个 | 安德莉亚 | +| 66000 个 | 拍打 | + +```r +sprintf("Mean income: %0.2f", mean(incomeDf$income)) +``` + +```r +## [1] "Mean income: 61600.00" +``` + +这个平均值似乎是这五个人收入的一个很好的总结。现在让我们看看如果碧昂斯·诺尔斯走进酒吧会发生什么: + +```r +# add Beyonce to income data frame + +incomeDf <- + incomeDf %>% + rbind(c(54000000, "Beyonce")) %>% + mutate(income = as.double(income)) + +pander(incomeDf) +``` + + +| income | person | +| --- | --- | +| 48000 | Joe | +| 64000 | Karen | +| 58000 | Mark | +| 72000 | Andrea | +| 66000 | Pat | +| 5.4E+07 型 | 碧昂斯 | + +```r +sprintf("Mean income: %0.2f", mean(incomeDf$income)) +``` + +```r +## [1] "Mean income: 9051333.33" +``` + +平均值现在接近 1000 万美元,这并不能真正代表酒吧里的任何人——特别是,它受到了碧昂丝价值的巨大驱动。一般来说,平均值对极值非常敏感,这就是为什么在使用平均值汇总数据时,确保没有极值总是很重要的原因。 + +# + +## 5.5.1 中间值 + +如果我们想以对异常值不太敏感的方式总结数据,我们可以使用另一种称为 _ 中位数 _ 的统计。如果我们按大小来排序所有的值,那么中值就是中间值。如果有一个偶数的值,那么中间会有两个值,在这种情况下,我们取这两个数字的平均值(即中间点)。 + +让我们来看一个例子。假设我们要总结以下值: + +```r +# create example data frame +dataDf <- + tibble( + values = c(8, 6, 3, 14, 12, 7, 6, 4, 9) + ) + +pander(dataDf) +``` + + +| 价值观 | +| --- | +| 8 个 | +| 6 | +| 三 | +| 14 | +| 12 个 | +| 7 | +| 6 | +| 4 | +| 9 | + +如果我们对这些值进行排序: + +```r +# sort values and print +dataDf <- + dataDf %>% + arrange(values) + +pander(dataDf) +``` + + +| values | +| --- | +| 3 | +| 4 | +| 6 | +| 6 | +| 7 | +| 8 | +| 9 | +| 12 | +| 14 | + +中间值是中间值,在本例中是 9 个值中的第 5 个。 + +平均值最小化平方误差之和,而中位数最小化一个微小的不同数量:绝对误差之和。这就解释了为什么它对异常值不那么敏感——与采用绝对值相比,平方化会加剧较大误差的影响。我们可以在收入示例中看到这一点: + +```r +# print income table +pander(incomeDf) +``` + + +| income | person | +| --- | --- | +| 48000 | Joe | +| 64000 | Karen | +| 58000 | Mark | +| 72000 | Andrea | +| 66000 | Pat | +| 5.4e+07 | Beyonce | + +```r +sprintf('Mean income: %.2f',mean(incomeDf$income)) +``` + +```r +## [1] "Mean income: 9051333.33" +``` + +```r +sprintf('Median income: %.2f',median(incomeDf$income)) +``` + +```r +## [1] "Median income: 65000.00" +``` + +中位数更能代表整个群体,对一个大的离群值不太敏感。 + +既然如此,我们为什么要用平均数呢?正如我们将在后面的章节中看到的,平均值是“最佳”估计值,因为与其他估计值相比,它在样本之间的差异较小。这取决于我们是否值得考虑对潜在异常值的敏感性——统计数据都是关于权衡的。 + +## 5.6 模式 + +有时,我们希望描述非数字数据集的中心趋势。例如,假设我们想知道哪种型号的 iPhone 最常用。假设我们问一组 iPhone 用户他们拥有哪种型号,并得到以下结果: + +```r +# compute mean of iPhone model numbers +iphoneDf <- + tribble( + ~iPhoneModel, ~count, + 5, 325, + 6, 450, + 7, 700, + 8, 625 +) + +meanPhoneNumber <- + iphoneDf %>% + summarize( + sum(iPhoneModel * count) / sum(count) + ) %>% + pull() +``` + +如果我们取这些值的平均值,我们会发现平均的 iPhone 型号是 6.77,这显然是无稽之谈,因为 iPhone 型号是按顺序排列的。在这种情况下,对集中趋势更合适的度量是模式,这是数据集中最常见的值,正如我们前面讨论的那样。 + +## 5.7 变异性:平均值与数据的拟合程度如何? + +一旦我们描述了数据的中心趋势,我们通常还想描述数据的变量——有时也称为“分散度”,这反映了一个事实,即它描述了数据的分散程度。 + +我们已经遇到了上面的平方误差之和,这是最常用的变异性度量的基础:方差 _ 和标准差 _。一个总体的方差(称为![](img/0f8ca157d9a8634321af2742af17e19a.jpg))只是平方误差除以观测次数的总和,也就是说,你之前遇到的 _ 平均平方误差 _。__ + +![](img/40df463030fe69b08c9f09cd9b17b0f5.jpg) + +其中![](img/4e4d506c887c843f43a8fbcbe1884ffd.jpg)是人口平均数。标准差就是这个的平方根,也就是我们以前看到的 _ 均方根误差 _。标准偏差是有用的,因为误差的单位与原始数据相同(撤消我们应用于误差的平方)。 + +我们通常无法访问整个群体,因此我们必须使用一个样本来计算方差,我们称之为![](img/72f5df22b97eb87e92f0f6fa566f7f4d.jpg),其中“hat”表示这是一个基于样本的估计。![](img/72f5df22b97eb87e92f0f6fa566f7f4d.jpg)的方程式与![](img/0f8ca157d9a8634321af2742af17e19a.jpg)的方程式相似: + +![](img/b18d9e2af672f64fe6dcbb5c47feb221.jpg) + +这两个方程之间的唯一区别是我们用 n-1 而不是 n 来除。这与一个基本的统计概念有关:_ 自由度 _。记住,为了计算样本方差,我们首先必须估计样本均值![](img/17ee279e0e3562706ec890e1da87b839.jpg)。在估计了这一点之后,数据中的一个值就不再是自由变化的了。例如,假设我们有以下数据点: + +```r +# generate example data points + +dfDf <- + tibble( + x = c(3, 5, 7, 9, 11) + ) + +pander(dfDf) +``` + + +| X | +| --- | +| 三 | +| 5 个 | +| 7 | +| 9 | +| 11 个 | + +现在我们计算平均值: + +```r +# compute mean + +meanx <- + dfDf %>% + summarize( + mean(x) + ) %>% + pull() + +sprintf('%0.2f',meanx) +``` + +```r +## [1] "7.00" +``` + +因为我们知道这个数据集的平均值是 7,所以我们可以计算出如果缺少某个特定的值会是什么。例如,假设我们要模糊第一个值(3)。这样做之后,我们仍然知道它的值必须是 3,因为 7 的平均值意味着所有值的总和是![](img/1e0ea8aaf5e5da62eae20709151b1d01.jpg)和![](img/65b5e4fedae569a671fceb3f111acea6.jpg)。 + +所以当我们说我们已经“失去”了一定程度的自由,这意味着有一个值在拟合模型后是不能自由改变的。在样本方差的背景下,如果我们不考虑失去的自由度,那么我们对样本方差的估计将是 _ 偏向 _——也就是说,它将小于真实(总体)值。 + +## 5.8 使用模拟了解统计数据 + +我非常了解使用计算机模拟来理解统计概念,在以后的课程中,我们将深入探讨这些概念的使用。在这里,我们将通过询问在计算样本方差时是否可以确认是否需要从样本大小中减去 1 来介绍这个想法。 + +让我们将来自 nhanes 数据的整个儿童样本视为我们的“群体”,并查看使用分母中的 n 或 n-1 计算样本方差对数据中大量模拟随机样本的群体方差有多好。现在不要担心细节——我们稍后会回到课程中。 + +```r +# compare variance estimates using N or N-1 in denominator + +population_variance <- + NHANES_child %>% + summarize( + var(Height) + ) %>% + pull() + +# take 100 samples and estimate the sample variance using both N or N-1 in the demoninator +sampsize <- 50 +nsamp <- 1000 +varhat_n <- array(data = NA, dim = nsamp) +varhat_nm1 <- array(data = NA, dim = nsamp) + +for (i in 1:nsamp) { + samp <- sample_n(NHANES_child, 1000)[1:sampsize, ] + sampmean <- mean(samp$Height) + sse <- sum((samp$Height - sampmean)**2) + varhat_n[i] <- sse / sampsize + varhat_nm1[i] <- sse / (sampsize - 1) +} + +sprintf("population variance: %.2f", population_variance) +``` + +```r +## [1] "population variance: 724.67" +``` + +```r +sprintf("variance estimate(n): %.2f", mean(varhat_n)) +``` + +```r +## [1] "variance estimate(n): 709.03" +``` + +```r +sprintf("variance estimate(n-1): %.2f", mean(varhat_nm1)) +``` + +```r +## [1] "variance estimate(n-1): 723.50" +``` + +这表明上述理论是正确的:以![](img/6a5f27b69ff34f05786b41f86ccfbbc7.jpg)为分母的方差估计与以全数据(即总体)为分母计算的方差非常接近,而以![](img/493731e423d5db62086d0b8705dda0c8.jpg)为分母计算的方差与真实的 v 值相比有偏差(较小)。值。 + +## 5.9 Z 分数 + +```r +crimeData <- + read.table( + "data/CrimeOneYearofData_clean.csv", + header = TRUE, + sep = "," + ) + +# let's drop DC since it is so small +crimeData <- + crimeData %>% + dplyr::filter(State != "District of Columbia") + +caCrimeData <- + crimeData %>% + dplyr::filter(State == "California") +``` + +以分布的中心趋势和变异性为特征后,通常有助于根据个体分数相对于总体分布的位置来表示。假设我们有兴趣描述不同州犯罪的相对水平,以确定加利福尼亚是否是一个特别危险的地方。我们可以使用来自[FBI 统一犯罪报告网站](https://www.ucrdatatool.gov/Search/Crime/State/RunCrimeOneYearofData.cfm)的 2014 年数据来问这个问题。图[5.8](#fig:crimeHist)的左面板显示了每个州暴力犯罪数量的柱状图,突出了加州的价值。从这些数据来看,加利福尼亚州似乎非常危险,当年共有 153709 起犯罪。 + +![Left: Histogram of the number of violent crimes. The value for CA is plotted in blue. Right: A map of the same data, with number of crimes plotted for each state in color.](img/file20.png) + +图 5.8 左:暴力犯罪数量的柱状图。CA 的值以蓝色绘制。右图:一张相同数据的地图,用彩色绘制每个州的犯罪数量。 + +使用 r,还可以很容易地生成一个显示变量跨状态分布的地图,如图[5.8](#fig:crimeHist)右面板所示。 + +然而,你可能已经意识到加州在美国任何一个州的人口都是最多的,所以它也会有更多的犯罪是合理的。如果我们将这两种情况相提并论(参见图[5.9](#fig:popVsCrime)的左面板),我们就会发现人口与犯罪数量之间存在直接关系。 + +![Left: A plot of number of crimes versus population by state. Right: A histogram of per capita crime rates, expressed as crimes per 100,000 people.](img/file21.png) + +图 5.9 左:按州划分的犯罪数量与人口的关系图。对:人均犯罪率的柱状图,以每 10 万人的犯罪率表示。 + +我们不应使用犯罪的原始数量,而应使用人均暴力犯罪率,即犯罪数量除以国家人口所得的比率。FBI 的数据集已经包含了这个值(以每 100000 人的比率表示)。 + +```r +# print crime rate statistics, normalizing for population + +sprintf("rate of 2014 violent crimes in CA: %.2f", caCrimeData$Violent.Crime.rate) +``` + +```r +## [1] "rate of 2014 violent crimes in CA: 396.10" +``` + +```r +sprintf("mean rate: %.2f", mean(crimeData$Violent.Crime.rate)) +``` + +```r +## [1] "mean rate: 346.81" +``` + +```r +sprintf("std of rate: %.2f", sd(crimeData$Violent.Crime.rate)) +``` + +```r +## [1] "std of rate: 128.82" +``` + +从右图[5.9](#fig:popVsCrime)中我们可以看出,加利福尼亚毕竟没有那么危险——它每 10 万人的犯罪率为 396.1,略高于 346.81 的平均值,但在许多其他州的范围内。但是,如果我们想更清楚地了解它与发行版的其他部分有多远呢? + +_z-score_ 允许我们以一种方式表示数据,从而更深入地了解每个数据点与整体分布的关系。如果我们知道总体平均值![](img/4e4d506c887c843f43a8fbcbe1884ffd.jpg)和标准差![](img/2469b2bd2a1ab19ebfcee223dcb52bb1.jpg)的值,则计算数据点 z 得分的公式为: + +![](img/8622fe3fbd8234f114c414fbf51c2618.jpg) + +直观地说,你可以把 z 值看作是告诉你离任何数据点的平均值有多远,以标准偏差为单位。我们可以根据犯罪率数据来计算,如图[5.10](#fig:crimeZplot)所示。 + +```r +## [1] "mean of Z-scored data: 1.4658413372004e-16" +``` + +```r +## [1] "std deviation of Z-scored data: 1" +``` + +![Scatterplot of original crime rate data against Z-scored data.](img/file22.png) + +图 5.10 原始犯罪率数据与 Z 评分数据的散点图。 + +散点图表明,z-得分的过程并没有改变数据点的相对分布(可以看到原始数据和 z-得分数据在相互作图时落在一条直线上),只是将它们移动到一个平均值为零和一个标准差。一个。然而,如果你仔细观察,你会发现平均值并不完全为零——只是非常小。这里所发生的是,计算机以一定的 _ 数字精度 _ 表示数字,这意味着有些数字不完全为零,但小到 R 认为它们为零。 + +```r +# examples of numerical precision + +print(paste("smallest number such that 1+x != 1", .Machine$double.eps)) +``` + +```r +## [1] "smallest number such that 1+x != 1 2.22044604925031e-16" +``` + +```r +# We can confirm this by showing that adding anything less than that number to +# 1 is treated as 1 by R +print((1 + .Machine$double.eps) == 1) +``` + +```r +## [1] FALSE +``` + +```r +print((1 + .Machine$double.eps / 2) == 1) +``` + +```r +## [1] TRUE +``` + +```r +# we can also look at the largest number +print(paste("largest number", .Machine$double.xmax)) +``` + +```r +## [1] "largest number 1.79769313486232e+308" +``` + +```r +# similarly here, we can see that adding 1 to the largest possible number +# is no different from the largest possible number, in R's eyes at least. +print((1 + .Machine$double.xmax) == .Machine$double.xmax) +``` + +```r +## [1] TRUE +``` + +图[5.11](#fig:crimeZmap)显示了使用地理视图的 Z 评分犯罪数据。 + +![Crime data rendered onto a US map, presented as Z-scores.](img/file23.png) + +图 5.11 呈现在美国地图上的犯罪数据,以 z 分数表示。 + +这为我们提供了一个稍微更具解释性的数据视图。例如,我们可以看到内华达州、田纳西州和新墨西哥州的犯罪率都比平均值高出大约两个标准差。 + +# + +## 5.9.1 解释 z-分数 + +“z-得分”中的“z”源于标准正态分布(即平均值为零且标准偏差为 1 的正态分布)通常被称为“z”分布。我们可以使用标准正态分布来帮助我们了解相对于分布的其余部分,特定的 z 分数告诉我们数据点的位置。 + +![Density (top) and cumulative distribution (bottom) of a standard normal distribution, with cutoffs at one standard deviation above/below the mean.](img/file24.png) + +图 5.12 标准正态分布的密度(顶部)和累积分布(底部),在平均值以上/以下的一个标准偏差处进行截止。 + +图[5.12](#fig:zDensityCDF)中的上面板显示,我们预计约 16%的值会落在![](img/67237d3f9b5b8a31ea44a87184389bb5.jpg)中,同样的比例也会落在![](img/88cf7506d0716660caaec77acb51a9c7.jpg)中。 + +![Density (top) and cumulative distribution (bottom) of a standard normal distribution, with cutoffs at two standard deviations above/below the mean](img/file25.png) + +图 5.13 标准正态分布的密度(顶部)和累积分布(底部),平均值以上/以下两个标准偏差处的截止值 + +图[5.13](#fig:zDensity2SD)显示了两个标准偏差的相同曲线图。在这里,我们看到只有约 2.3%的值落在![](img/68ba2813e97287d88b6694f681aed629.jpg)中,同样的也落在![](img/9817dc62b48fd93386eb42f43f1d3e2c.jpg)中。因此,如果我们知道特定数据点的 z 值,我们可以估计找到一个值的可能性或可能性有多大,至少与该值一样极端,这样我们就可以将值放入更好的上下文中。 + +# + +## 5.9.2 标准化评分 + +假设我们希望生成平均值为 100、标准差为 10 的标准化犯罪评分,而不是 Z 评分。这类似于用智力测验的分数来产生智力商数(IQ)的标准化。我们可以简单地将 z 分数乘以 10,然后再加 100。 + +```r +## [1] "mean of standardized score data: 100" +``` + +```r +## [1] "std deviation of standardized score data: 10" +``` + +![Crime data presented as standardized scores with mean of 100 and standard deviation of 10.](img/file26.png) + +图 5.14 犯罪数据以标准化分数呈现,平均值为 100,标准差为 10。 + +## + +## 5.9.2.1 使用 z 分比较分布 + +z 值的一个有用的应用是比较不同变量的分布。假设我们想比较暴力犯罪和财产犯罪在各州的分布情况。在图[5.15](#fig:crimeTypePlot)的左面板中,我们将这些图形绘制在一起,用蓝色绘制 CA。正如你所看到的,财产犯罪的原始率远远高于暴力犯罪的原始率,所以我们不能直接比较数字。但是,我们可以将这些数据的 z 值相互绘制出来(图[5.15](#fig:crimeTypePlot)的右面板)——这里我们再次看到数据的分布没有改变。把每一个变量的数据放入 z 值后,就可以进行比较了,让我们看到加州实际上处于暴力犯罪和财产犯罪分布的中间。 + +![Plot of violent vs. property crime rates (left) and Z-scored rates (right).](img/file27.png) + +图 5.15 暴力与财产犯罪率(左)和 Z 得分率(右)的曲线图。 + +让我们再给情节加一个因素:人口。在图[5.16](#fig:crimeTypePopPlot)的左面板中,我们使用绘图符号的大小来显示这一点,这通常是向绘图添加信息的一种有用方法。 + +![Left: Plot of violent vs. property crime rates, with population size presented through the size of the plotting symbol; California is presented in blue. Right: Difference scores for violent vs. property crime, plotted against population. ](img/file28.png) + +图 5.16 左图:暴力犯罪率与财产犯罪率的对比图,人口规模以绘图符号的大小表示;加利福尼亚州以蓝色表示。对:针对人口的暴力和财产犯罪的得分差异。 + +因为 z 分数是直接可比的,所以我们也可以计算“暴力差异”分数,该分数表示各州暴力与非暴力(财产)犯罪的相对比率。然后我们可以将这些得分与人口进行对比(参见图[5.16](#fig:crimeTypePopPlot)的右面板)。这说明我们如何使用 z-分数将不同的变量放在一个共同的尺度上。 + +值得注意的是,最小的国家在两个方向上的差异似乎最大。虽然这可能会吸引我们去观察每一个状态,并试图确定为什么它有一个高或低的差异分数,但这可能反映了这样一个事实,即从较小的样本中获得的估计值必然会有更多的变量,正如我们将在几章中更详细地讨论的那样。 \ No newline at end of file diff --git a/docs/5.x2.md b/docs/5.x2.md deleted file mode 100644 index 27a894de9d1fa3531e5e3a50b686fbce515c3636..0000000000000000000000000000000000000000 --- a/docs/5.x2.md +++ /dev/null @@ -1,739 +0,0 @@ -# 5 将模型拟合到数据 - -统计学中的一个基本活动是创建可以使用一组小数字汇总数据的模型,从而提供对数据的简洁描述。在本章中,我们将讨论统计模型的概念以及如何使用它来描述数据。 - -## 5.1 什么是模型? - -在物理世界中,“模型”通常是对现实世界中事物的简化,尽管如此,它还是传达了被建模事物的本质。建筑物的模型传递建筑物的结构,同时又小又轻,足以用手拿起;生物学中的细胞模型比实际物体大得多,但又传递了细胞的主要部分及其关系。 - -在统计学中,模型的目的是提供一个类似的简明描述,但用于数据而不是物理结构。与物理模型一样,统计模型通常比所描述的数据简单得多;它旨在尽可能简单地捕获数据的结构。在这两种情况下,我们都意识到,模型是一种方便的虚构,它必然掩盖了被建模的实际事物的一些细节。正如统计学家乔治博克斯所说:“所有的模型都是错误的,但有些模型是有用的。” - -统计模型的基本结构是: - -![](img/0c021ca249df797a2c6e689f7616f5a3.jpg) - -这表明数据可以用一个统计模型来描述,这个模型描述了我们期望在数据中发生的事情,以及模型和数据之间的差异,我们称之为 _ 错误 _。 - -## 5.2 统计建模:示例 - -让我们来看一个使用 nhanes 中的数据将模型拟合到数据的示例。特别是,我们将尝试在 nhanes 样本中建立儿童身高的模型。首先,让我们加载数据并绘制它们(参见图[5.1](#fig:childHeight))。 - -![Histogram of height of children in NHANES.](img/file13.png) - -图 5.1 NHANES 儿童身高柱状图。 - -请记住,我们希望尽可能简单地描述数据,同时仍然捕获它们的重要特性。我们能想象的最简单的模型是什么,它仍然能够捕获数据的本质?数据集中最常见的值(我们称之为 _ 模式 _)如何?R 没有内置的模式函数,所以我们将首先创建一个,我们称之为`getmode()`。 - -```r -# create function to compute mode and apply to child height data from NHANES -getmode <- function(v) { - uniqv <- unique(v) - return(uniqv[which.max(tabulate(match(v, uniqv)))]) -} - -height_mode <- getmode(NHANES_child$Height) - -paste("mode of children's height from NHANES:", height_mode) -``` - -```r -## [1] "mode of children's height from NHANES: 166.5" -``` - -鉴于此,我们针对单个数据点![](img/31df9c730e19ca29b59dce64b99d98c1.jpg)的模型将是: - -![](img/8f1a8d16a7bccf2f8932fa75c5d9486b.jpg) - -这就用一个数字重新定义了 1691 个孩子的整个集合,如果我们想预测任何一个新孩子的身高,那么我们的猜测将是相同的数字:166.5 厘米。 - -这个模型有多好?一般来说,我们用误差来定义模型的优度,它代表了模型和数据之间的差异;所有事物都是相等的,产生较低误差的模型就是更好的模型。 - -```r -# compute error compared to the mode and plot histogram - -error_mode <- NHANES_child$Height - height_mode -sprintf("average error from mode (cm): %0.2f", mean(error_mode)) -``` - -```r -## [1] "average error from mode (cm): -28.80" -``` - -我们发现平均个体的误差相当大,为-28.8 厘米。我们想要一个平均误差为零的模型,结果是如果我们使用算术平均值(通常称为 _ 平均值 _)作为我们的模型,那么情况就是这样。 - -平均值(通常用变量上的条表示,如![](img/17ee279e0e3562706ec890e1da87b839.jpg))定义为: - -![](img/5b53c23c73ac1d477dfe58135c39125b.jpg) - -也就是说,它是所有值的总和,除以值的数目。我们可以证明平均误差(因此平均误差)之和为零: - -![](img/58242f7f4f1e470a16a6c033ab66e6e0.jpg) - -![](img/a3c6e3addb29d9306b8debc2d55ef696.jpg) - -![](img/cc05829e6579c35a8c07658c455c5cc7.jpg) - -![](img/40c761930ed69a3d87b3e8efef7a60f2.jpg) - -![](img/29d5b7dc9f47275015354d5507b398f8.jpg) - -考虑到平均误差为零,这似乎是一个更好的模型。让我们确认一下它是正确的。 - -```r -# compute error from mean - -error_mean <- NHANES_child$Height - mean(NHANES_child$Height) -sprintf("average error for mean (cm): %e", mean(error_mean)) -``` - -```r -## [1] "average error for mean (cm): -9.864171e-15" -``` - -![Distribution of errors from the mean.](img/file14.png) - -图 5.2 平均值误差分布。 - -这里的平均误差是一个非常小的数字,虽然技术上不是零;我们稍后将在课程中讨论为什么会发生这种情况(这是由于计算机如何表示数字),但现在您可以将其视为接近零,称之为零。 - -尽管平均误差的平均值为零,但从图[5.2](#fig:meanError)中的柱状图可以看出,每个个体仍然存在一定程度的误差;有些是正的,有些是负的,而这些误差相互抵消。出于这个原因,我们通常用某种将正错误和负错误都算作坏的度量来总结错误。我们可以使用每个误差值的绝对值,但更常见的是使用平方误差,这是我们将在本课程后面看到的原因。 - -有几种常见的方法来总结在本书的不同点上会遇到的平方误差,因此了解它们之间的关系是很重要的。首先,我们可以简单地把它们加起来;这被称为 _ 平方误差之和 _。我们通常不使用它的原因是它的大小取决于数据点的数量,所以除非我们观察相同数量的观测结果,否则很难解释。其次,我们可以取平方误差值的平均值,即 _ 平均平方误差(mse)_。但是,由于我们在求平均值之前对这些值进行了平方处理,因此它们与原始数据的比例不同;它们位于![](img/b76fa8e9240baa1b063fdb1b291014ef.jpg)中。由于这个原因,我们也经常采用 mse 的平方根,我们称之为 _ 均方根误差(rmse)_,因此它与原始值的单位相同(在本例中为厘米)。 - -```r -# compute and print RMSE for mean and mode -rmse_mean <- sqrt(mean(error_mean**2)) - -rmse_mode <- sqrt(mean(error_mode**2)) - -print(paste("Mode: root mean squared error (centimeters):", rmse_mode)) -``` - -```r -## [1] "Mode: root mean squared error (centimeters): 39.4197926582947" -``` - -```r -print(paste("Mean: root mean squared error (centimeters):", rmse_mean)) -``` - -```r -## [1] "Mean: root mean squared error (centimeters): 26.9116738708646" -``` - -这表明平均值有相当大的误差——任何数据点平均距离平均值大约 27 厘米——但它仍然比模式好得多。 - -# - -## 5.2.1 改进我们的模型 - -我们能想象一个更好的模型吗?请记住,这些数据来自 NHANES 样本中的所有儿童,他们的年龄从 2 岁到 17 岁不等。鉴于年龄范围很广,我们可能期望我们的身高模型也包括年龄。让我们绘制身高和年龄的数据,看看这种关系是否真的存在。 - -![Height of children in NHANES, plotted without a model (A), with a linear model including only age (B) or age and a constant (C), and with a linear model that fits separate effects of age for males and females (D).](img/file15.png) - -图 5.3 NHANES 儿童的身高,未使用模型(a)绘制,线性模型仅包括年龄(b)或年龄和常数(c),线性模型适合男性和女性年龄的单独影响(d)。 - -图[5.3](#fig:childHeightLine)的面板 A 中的黑点显示了数据集中的个体,正如我们所期望的,身高和年龄之间似乎有着很强的关系。因此,我们可以建立一个高度与年龄相关的模型: - -![](img/c717cebcba3f84002e2514ee52151fcf.jpg) - -其中![](img/50705df736e9a7919e768cf8c4e4f794.jpg)是一个 _ 参数 _,我们用年龄相乘得到最小的误差。您可能已经注意到,这只是一条斜率为![](img/50705df736e9a7919e768cf8c4e4f794.jpg)的直线,为了看到这一点,让我们在数据顶部用蓝色绘制出最适合的直线(图[5.3](#fig:childHeightLine)中的面板 B)。这个模型显然有问题,因为这条线似乎没有很好地跟踪数据。事实上,这个模型(39.16)的 RMSE 实际上比只包含平均值的模型高!这个问题是因为我们的模型只包括年龄,这意味着当年龄为零时,模型的高度预测值必须为零。即使数据不包括任何年龄为零的子代,但当 x 为零时,该行在数学上被限制为 Y 值为零,这就解释了为什么该行被下拉到较年轻的数据点之下。我们可以通过在我们的模型中包含一个常量来解决这个问题,它基本上代表年龄等于零时高度的估计值;尽管在这个数据集中零岁的年龄是不合理的,但这是一个数学技巧,它将允许模型解释数据。模型为: - -![](img/5f3c8825cfc704e26a0eefeb99111407.jpg) - -其中 _ 常数 _ 是对所有个体的预测增加的一个常量值(我们也称为 _ 截距 _,因为它映射到一条直线方程中的截距上)。稍后我们还将了解如何实际计算这些值;现在,我们将使用 r 中的`lm()`函数计算常量的值,并使用![](img/50705df736e9a7919e768cf8c4e4f794.jpg)计算出最小的错误。图[5.3](#fig:childHeightLine)中的面板 C 显示了适合于 nhanes 数据的该模型,在该模型中,我们看到线条与数据的匹配比没有常量的要好得多。 - -```r -## [1] "model: height = 86.11 + 5.48*Age" -``` - -```r -## [1] "root mean squared error: 8.36" -``` - -使用这个模型,我们的误差要小得多——平均只有 8.36 厘米。你能想到其他可能与身高有关的变量吗?性别呢?在图[5.3](#fig:childHeightLine)的面板 D 中,我们用分别为男性和女性安装的线条绘制数据。从情节上看,男性和女性之间似乎存在差异,但相对较小,仅在青春期后出现。让我们估计一下这个模型,看看错误是什么样子的: - -```r -# compute model fit for modeling with age and gender - -model_age_gender <- lm(Height ~ Age + Gender, data = NHANES_child) - -rmse_age_gender <- - NHANES_child %>% - add_predictions(model_age_gender, var = "predicted_age_gender") %>% - summarise( - sqrt(mean((Height - predicted_age_gender)**2)) - ) %>% - pull() - -sprintf( - "model: height = %0.2f + %0.2f*Age + %0.2f*Gender", - model_age_gender$coefficients[1], - model_age_gender$coefficients[2], - model_age_gender$coefficients[3] -) -``` - -```r -## [1] "model: height = 84.37 + 5.48*Age + 3.28*Gender" -``` - -```r -print(sprintf("root mean squared error: %0.2f", rmse_age_gender)) -``` - -```r -## [1] "root mean squared error: 8.20" -``` - -在图[5.4](#fig:msePlot)中,我们绘制了不同模型的均方根误差值。从这一点上,我们可以看到,从一种模式到另一种模式,从一种模式到另一种模式,从一种模式到另一种模式再到另一种模式+年龄,这个模式变得更好了一点,而且只通过将性别也包括在内,就可以说更好了。 - -![Mean squared error plotted for each of the models tested above.](img/file16.png) - -图 5.4 为上述测试的每个模型绘制的均方误差。 - -## 5.3 什么使模型“良好”? - -从我们的统计模型中,我们通常需要两种不同的东西。首先,我们希望它能够很好地描述我们的数据;也就是说,我们希望它在建模数据时具有尽可能低的错误。第二,我们希望它能够很好地概括为新的数据集;也就是说,当我们将其应用于新的数据集时,我们希望它的错误尽可能低。事实证明,这两个特性经常会发生冲突。 - -为了理解这一点,让我们考虑一下错误的来源。首先,如果我们的模型是错误的,就可能发生这种情况;例如,如果我们不准确地说身高随年龄而下降而不是上升,那么我们的错误将高于正确模型的错误。同样,如果我们的模型中缺少一个重要因素,这也会增加我们的误差(就像我们把年龄从模型中排除在身高之外时那样)。然而,即使模型是正确的,误差也可能发生,因为数据的随机变化,我们通常称之为“测量误差”或“噪声”。有时,这实际上是由于我们的测量误差造成的——例如,当测量值依赖于人时,例如使用秒表测量竞走中经过的时间。在其他情况下,我们的测量设备是高度精确的(像测量体重的数字秤),但被测量的东西受到许多不同因素的影响,这些因素导致它是可变的。如果我们知道所有这些因素,那么我们就可以建立一个更精确的模型,但事实上,这几乎不可能。 - -让我们用一个例子来说明这一点。我们不使用实际数据,而是为示例生成一些数据;我们将在本课程后面更详细地讨论模拟数据的生成。假设我们想了解一个人的血液酒精含量(BAC)和他们在模拟驾驶考试中的反应时间之间的关系。我们可以生成一些模拟数据并绘制关系图(参见图[5.5](#fig:BACrt)的面板 A)。 - -![Simulated relationship between blood alcohol content and reaction time on a driving test, with best-fitting linear model. A: linear relationship with low measurement error. B: linear relationship with higher measurement error. C: Nonlinear relationship with low measurement error and (incorrect) linear model](img/file17.png) - -图 5.5 驾驶试验中血液酒精含量与反应时间的模拟关系,最佳拟合线性模型。A:线性关系,测量误差小。B:线性关系,测量误差较大。C:具有低测量误差和(不正确)线性模型的非线性关系 - -在这个例子中,反应时间随血液中的酒精含量而有系统地增加——蓝线表示最合适的模型,我们可以看到误差很小,这很明显,所有的点都非常接近这条线。 - -我们也可以想象数据显示相同的线性关系,但有更多的误差,如图[5.5](#fig:BACrt)的面板 B 所示。在这里,我们看到仍然有一个系统的反应时间增加与细菌,但它是更多的个人变量。 - -这两个例子都是 _ 线性模型 _ 似乎合适的,并且误差反映了我们测量中的噪声。线性模型规定两个变量之间的关系遵循直线。例如,在线性模型中,无论 BAC 的级别如何,BAC 的变化总是与反应时间的特定变化相关。 - -另一方面,还有其他情况下线性模型是不正确的,并且由于没有正确地指定模型,误差会增加。假设我们对咖啡因摄入量和测试表现之间的关系感兴趣。咖啡因等兴奋剂与测试成绩之间的关系往往是非线性的,也就是说,它不遵循直线。这是因为随着咖啡因含量的减少(当这个人变得更加警觉时),工作表现也会随之上升,但随着咖啡因含量的增加(当这个人变得紧张和紧张时),工作表现也会开始下降。我们可以模拟这种形式的数据,然后将线性模型拟合到数据中(参见图[5.5](#fig:BACrt)的面板 C)。蓝线表示最符合这些数据的直线;显然,存在高度错误。虽然在测试表现和咖啡因摄入量之间有着非常合法的关系,但它是一条曲线而不是一条直线。线性模型误差很大,因为它是这些数据的错误模型。 - -## 5.4 模型是否太好? - -错误听起来像是一件坏事,通常我们更喜欢误差较低的模型,而不是误差较高的模型。然而,我们在上面提到,在模型精确地适应当前数据集的能力和它概括为新数据集的能力之间存在着一种张力,并且结果表明,误差最小的模型在概括为新数据集时往往更糟糕! - -为了看到这一点,让我们再次生成一些数据,以便我们知道变量之间的真正关系。我们将创建两个模拟数据集,它们以完全相同的方式生成——它们只是添加了不同的随机噪声。 - -![An example of overfitting. Both datasets were generated using the same model, with different random noise added to generate each set. The left panel shows the data used to fit the model, with a simple linear fit in blue and a complex (8th order polynomial) fit in red. The root mean square error values for each model are shown in the figure; in this case, the complex model has a lower RMSE than the simple model. The right panel shows the second dataset, with the same model overlaid on it and the RMSE values computed using the model obtained from the first dataset. Here we see that the simpler model actually fits the new dataset better than the more complex model, which was overfitted to the first dataset.](img/file18.png) - -图 5.6 过拟合示例。两个数据集都是使用相同的模型生成的,每个数据集都添加了不同的随机噪声。左面板显示了用于拟合模型的数据,简单的蓝色线性拟合和复杂的(8 阶多项式)红色拟合。每个模型的均方根误差值如图所示;在这种情况下,复杂模型的 RMSE 比简单模型低。右面板显示了第二个数据集,上面覆盖了相同的模型,并且使用从第一个数据集获得的模型计算了 RMSE 值。在这里,我们看到更简单的模型实际上比更复杂的模型更适合新的数据集,后者过度适合第一个数据集。 - -图[5.6](#fig:Overfitting)中的左面板显示,更复杂的模型(红色)比简单的模型(蓝色)更适合数据。然而,当相同的模型应用于以相同方式生成的新数据集时,我们看到了相反的情况——这里我们看到,较简单的模型比较复杂的模型更适合新数据。从直观上看,较复杂的模型受第一个数据集中特定数据点的影响较大;由于这些数据点的确切位置受随机噪声的驱动,导致较复杂的模型很难适应新的数据集。这是一个我们称之为 _ 过拟合 _ 的现象,我们将在本课程中反复讨论。稍后,我们将学习一些技术,我们可以使用这些技术来防止过度拟合,同时仍然对数据结构敏感。现在,重要的是要记住,我们的模型适合需要是好的,但不是太好。正如阿尔伯特爱因斯坦(1933)所说:“几乎不能否认,所有理论的最高目标是使不可约的基本要素尽可能简单和少,而不必放弃对单一经验数据的充分表示。”这通常被解释为:“一切应该尽可能简单,但不能简单。” - -## 5.5 最简单的模型:平均值 - -我们已经遇到了平均值(或平均值),事实上,大多数人知道平均值,即使他们从未上过统计课。它通常用来描述我们称之为数据集“中心趋势”的东西——也就是说,数据以什么值为中心?大多数人不认为计算平均值是将模型与数据相匹配。然而,这正是我们计算平均值时要做的。 - -我们已经看到了计算数据样本平均值的公式: - -![](img/5b53c23c73ac1d477dfe58135c39125b.jpg) - -注意,我说过这个公式是专门针对数据的 _ 样本 _ 的,它是从更大的人群中选择的一组数据点。我们希望通过一个样本来描述一个更大的群体——我们感兴趣的全套个体。例如,如果我们是一个政治民意测验者,我们感兴趣的人群可能都是注册选民,而我们的样本可能只包括从这个人群中抽取的几千人。在本课程的后面,我们将更详细地讨论抽样,但现在重要的一点是统计学家通常喜欢使用不同的符号来区分描述样本值的统计数据和描述总体值的参数;在这种情况下,公式 a 表示总体平均值(表示为![](img/4e4d506c887c843f43a8fbcbe1884ffd.jpg))为: - -![](img/31b706b8ff77ab1267e8325dd64b1954.jpg) - -其中 n 是整个人口的大小。 - -我们已经看到,平均值是保证给我们的平均误差为零的汇总统计。平均值还有另一个特点:它是最小化平方误差总和(SSE)的汇总统计。在统计学中,我们称之为“最佳”估计量。我们可以从数学上证明这一点,但我们将在图[5.7](#fig:MinSSE)中以图形方式证明这一点。 - -![A demonstration of the mean as the statistic that minimizes the sum of squared errors. Using the NHANES child height data, we compute the mean (denoted by the blue bar). Then, we test a range of other values, and for each one we compute the sum of squared errors for each data point from that value, which are denoted by the black curve. We see that the mean falls at the minimum of the squared error plot.](img/file19.png) - -图 5.7 平均值作为统计值的证明,可使平方误差之和最小化。使用 nhanes 子高度数据,我们计算平均值(用蓝色条表示)。然后,我们测试其他值的范围,对于每个值,我们从该值计算每个数据点的平方误差之和,该值由黑色曲线表示。我们看到平均值降到平方误差图的最小值。 - -SSE 的最小化是一个很好的特性,这就是为什么平均值是最常用的统计数据汇总。然而,均值也有一个阴暗面。假设一个酒吧有五个人,我们检查每个人的收入: - -```r -# create income data frame - -incomeDf <- - tibble( - income = c(48000, 64000, 58000, 72000, 66000), - person = c("Joe", "Karen", "Mark", "Andrea", "Pat") -) -# glimpse(incomeDf) - -panderOptions('digits',2) -pander(incomeDf) -``` - - -| 收入 | 人 | -| --- | --- | -| 48000 个 | 乔 | -| 64000 个 | 凯伦 | -| 5.8 万 | 作记号 | -| 72000 个 | 安德莉亚 | -| 66000 个 | 拍打 | - -```r -sprintf("Mean income: %0.2f", mean(incomeDf$income)) -``` - -```r -## [1] "Mean income: 61600.00" -``` - -这个平均值似乎是这五个人收入的一个很好的总结。现在让我们看看如果碧昂斯·诺尔斯走进酒吧会发生什么: - -```r -# add Beyonce to income data frame - -incomeDf <- - incomeDf %>% - rbind(c(54000000, "Beyonce")) %>% - mutate(income = as.double(income)) - -pander(incomeDf) -``` - - -| income | person | -| --- | --- | -| 48000 | Joe | -| 64000 | Karen | -| 58000 | Mark | -| 72000 | Andrea | -| 66000 | Pat | -| 5.4E+07 型 | 碧昂斯 | - -```r -sprintf("Mean income: %0.2f", mean(incomeDf$income)) -``` - -```r -## [1] "Mean income: 9051333.33" -``` - -平均值现在接近 1000 万美元,这并不能真正代表酒吧里的任何人——特别是,它受到了碧昂丝价值的巨大驱动。一般来说,平均值对极值非常敏感,这就是为什么在使用平均值汇总数据时,确保没有极值总是很重要的原因。 - -# - -## 5.5.1 中间值 - -如果我们想以对异常值不太敏感的方式总结数据,我们可以使用另一种称为 _ 中位数 _ 的统计。如果我们按大小来排序所有的值,那么中值就是中间值。如果有一个偶数的值,那么中间会有两个值,在这种情况下,我们取这两个数字的平均值(即中间点)。 - -让我们来看一个例子。假设我们要总结以下值: - -```r -# create example data frame -dataDf <- - tibble( - values = c(8, 6, 3, 14, 12, 7, 6, 4, 9) - ) - -pander(dataDf) -``` - - -| 价值观 | -| --- | -| 8 个 | -| 6 | -| 三 | -| 14 | -| 12 个 | -| 7 | -| 6 | -| 4 | -| 9 | - -如果我们对这些值进行排序: - -```r -# sort values and print -dataDf <- - dataDf %>% - arrange(values) - -pander(dataDf) -``` - - -| values | -| --- | -| 3 | -| 4 | -| 6 | -| 6 | -| 7 | -| 8 | -| 9 | -| 12 | -| 14 | - -中间值是中间值,在本例中是 9 个值中的第 5 个。 - -平均值最小化平方误差之和,而中位数最小化一个微小的不同数量:绝对误差之和。这就解释了为什么它对异常值不那么敏感——与采用绝对值相比,平方化会加剧较大误差的影响。我们可以在收入示例中看到这一点: - -```r -# print income table -pander(incomeDf) -``` - - -| income | person | -| --- | --- | -| 48000 | Joe | -| 64000 | Karen | -| 58000 | Mark | -| 72000 | Andrea | -| 66000 | Pat | -| 5.4e+07 | Beyonce | - -```r -sprintf('Mean income: %.2f',mean(incomeDf$income)) -``` - -```r -## [1] "Mean income: 9051333.33" -``` - -```r -sprintf('Median income: %.2f',median(incomeDf$income)) -``` - -```r -## [1] "Median income: 65000.00" -``` - -中位数更能代表整个群体,对一个大的离群值不太敏感。 - -既然如此,我们为什么要用平均数呢?正如我们将在后面的章节中看到的,平均值是“最佳”估计值,因为与其他估计值相比,它在样本之间的差异较小。这取决于我们是否值得考虑对潜在异常值的敏感性——统计数据都是关于权衡的。 - -## 5.6 模式 - -有时,我们希望描述非数字数据集的中心趋势。例如,假设我们想知道哪种型号的 iPhone 最常用。假设我们问一组 iPhone 用户他们拥有哪种型号,并得到以下结果: - -```r -# compute mean of iPhone model numbers -iphoneDf <- - tribble( - ~iPhoneModel, ~count, - 5, 325, - 6, 450, - 7, 700, - 8, 625 -) - -meanPhoneNumber <- - iphoneDf %>% - summarize( - sum(iPhoneModel * count) / sum(count) - ) %>% - pull() -``` - -如果我们取这些值的平均值,我们会发现平均的 iPhone 型号是 6.77,这显然是无稽之谈,因为 iPhone 型号是按顺序排列的。在这种情况下,对集中趋势更合适的度量是模式,这是数据集中最常见的值,正如我们前面讨论的那样。 - -## 5.7 变异性:平均值与数据的拟合程度如何? - -一旦我们描述了数据的中心趋势,我们通常还想描述数据的变量——有时也称为“分散度”,这反映了一个事实,即它描述了数据的分散程度。 - -我们已经遇到了上面的平方误差之和,这是最常用的变异性度量的基础:方差 _ 和标准差 _。一个总体的方差(称为![](img/0f8ca157d9a8634321af2742af17e19a.jpg))只是平方误差除以观测次数的总和,也就是说,你之前遇到的 _ 平均平方误差 _。__ - -![](img/40df463030fe69b08c9f09cd9b17b0f5.jpg) - -其中![](img/4e4d506c887c843f43a8fbcbe1884ffd.jpg)是人口平均数。标准差就是这个的平方根,也就是我们以前看到的 _ 均方根误差 _。标准偏差是有用的,因为误差的单位与原始数据相同(撤消我们应用于误差的平方)。 - -我们通常无法访问整个群体,因此我们必须使用一个样本来计算方差,我们称之为![](img/72f5df22b97eb87e92f0f6fa566f7f4d.jpg),其中“hat”表示这是一个基于样本的估计。![](img/72f5df22b97eb87e92f0f6fa566f7f4d.jpg)的方程式与![](img/0f8ca157d9a8634321af2742af17e19a.jpg)的方程式相似: - -![](img/b18d9e2af672f64fe6dcbb5c47feb221.jpg) - -这两个方程之间的唯一区别是我们用 n-1 而不是 n 来除。这与一个基本的统计概念有关:_ 自由度 _。记住,为了计算样本方差,我们首先必须估计样本均值![](img/17ee279e0e3562706ec890e1da87b839.jpg)。在估计了这一点之后,数据中的一个值就不再是自由变化的了。例如,假设我们有以下数据点: - -```r -# generate example data points - -dfDf <- - tibble( - x = c(3, 5, 7, 9, 11) - ) - -pander(dfDf) -``` - - -| X | -| --- | -| 三 | -| 5 个 | -| 7 | -| 9 | -| 11 个 | - -现在我们计算平均值: - -```r -# compute mean - -meanx <- - dfDf %>% - summarize( - mean(x) - ) %>% - pull() - -sprintf('%0.2f',meanx) -``` - -```r -## [1] "7.00" -``` - -因为我们知道这个数据集的平均值是 7,所以我们可以计算出如果缺少某个特定的值会是什么。例如,假设我们要模糊第一个值(3)。这样做之后,我们仍然知道它的值必须是 3,因为 7 的平均值意味着所有值的总和是![](img/1e0ea8aaf5e5da62eae20709151b1d01.jpg)和![](img/65b5e4fedae569a671fceb3f111acea6.jpg)。 - -所以当我们说我们已经“失去”了一定程度的自由,这意味着有一个值在拟合模型后是不能自由改变的。在样本方差的背景下,如果我们不考虑失去的自由度,那么我们对样本方差的估计将是 _ 偏向 _——也就是说,它将小于真实(总体)值。 - -## 5.8 使用模拟了解统计数据 - -我非常了解使用计算机模拟来理解统计概念,在以后的课程中,我们将深入探讨这些概念的使用。在这里,我们将通过询问在计算样本方差时是否可以确认是否需要从样本大小中减去 1 来介绍这个想法。 - -让我们将来自 nhanes 数据的整个儿童样本视为我们的“群体”,并查看使用分母中的 n 或 n-1 计算样本方差对数据中大量模拟随机样本的群体方差有多好。现在不要担心细节——我们稍后会回到课程中。 - -```r -# compare variance estimates using N or N-1 in denominator - -population_variance <- - NHANES_child %>% - summarize( - var(Height) - ) %>% - pull() - -# take 100 samples and estimate the sample variance using both N or N-1 in the demoninator -sampsize <- 50 -nsamp <- 1000 -varhat_n <- array(data = NA, dim = nsamp) -varhat_nm1 <- array(data = NA, dim = nsamp) - -for (i in 1:nsamp) { - samp <- sample_n(NHANES_child, 1000)[1:sampsize, ] - sampmean <- mean(samp$Height) - sse <- sum((samp$Height - sampmean)**2) - varhat_n[i] <- sse / sampsize - varhat_nm1[i] <- sse / (sampsize - 1) -} - -sprintf("population variance: %.2f", population_variance) -``` - -```r -## [1] "population variance: 724.67" -``` - -```r -sprintf("variance estimate(n): %.2f", mean(varhat_n)) -``` - -```r -## [1] "variance estimate(n): 709.03" -``` - -```r -sprintf("variance estimate(n-1): %.2f", mean(varhat_nm1)) -``` - -```r -## [1] "variance estimate(n-1): 723.50" -``` - -这表明上述理论是正确的:以![](img/6a5f27b69ff34f05786b41f86ccfbbc7.jpg)为分母的方差估计与以全数据(即总体)为分母计算的方差非常接近,而以![](img/493731e423d5db62086d0b8705dda0c8.jpg)为分母计算的方差与真实的 v 值相比有偏差(较小)。值。 - -## 5.9 Z 分数 - -```r -crimeData <- - read.table( - "data/CrimeOneYearofData_clean.csv", - header = TRUE, - sep = "," - ) - -# let's drop DC since it is so small -crimeData <- - crimeData %>% - dplyr::filter(State != "District of Columbia") - -caCrimeData <- - crimeData %>% - dplyr::filter(State == "California") -``` - -以分布的中心趋势和变异性为特征后,通常有助于根据个体分数相对于总体分布的位置来表示。假设我们有兴趣描述不同州犯罪的相对水平,以确定加利福尼亚是否是一个特别危险的地方。我们可以使用来自[FBI 统一犯罪报告网站](https://www.ucrdatatool.gov/Search/Crime/State/RunCrimeOneYearofData.cfm)的 2014 年数据来问这个问题。图[5.8](#fig:crimeHist)的左面板显示了每个州暴力犯罪数量的柱状图,突出了加州的价值。从这些数据来看,加利福尼亚州似乎非常危险,当年共有 153709 起犯罪。 - -![Left: Histogram of the number of violent crimes. The value for CA is plotted in blue. Right: A map of the same data, with number of crimes plotted for each state in color.](img/file20.png) - -图 5.8 左:暴力犯罪数量的柱状图。CA 的值以蓝色绘制。右图:一张相同数据的地图,用彩色绘制每个州的犯罪数量。 - -使用 r,还可以很容易地生成一个显示变量跨状态分布的地图,如图[5.8](#fig:crimeHist)右面板所示。 - -然而,你可能已经意识到加州在美国任何一个州的人口都是最多的,所以它也会有更多的犯罪是合理的。如果我们将这两种情况相提并论(参见图[5.9](#fig:popVsCrime)的左面板),我们就会发现人口与犯罪数量之间存在直接关系。 - -![Left: A plot of number of crimes versus population by state. Right: A histogram of per capita crime rates, expressed as crimes per 100,000 people.](img/file21.png) - -图 5.9 左:按州划分的犯罪数量与人口的关系图。对:人均犯罪率的柱状图,以每 10 万人的犯罪率表示。 - -我们不应使用犯罪的原始数量,而应使用人均暴力犯罪率,即犯罪数量除以国家人口所得的比率。FBI 的数据集已经包含了这个值(以每 100000 人的比率表示)。 - -```r -# print crime rate statistics, normalizing for population - -sprintf("rate of 2014 violent crimes in CA: %.2f", caCrimeData$Violent.Crime.rate) -``` - -```r -## [1] "rate of 2014 violent crimes in CA: 396.10" -``` - -```r -sprintf("mean rate: %.2f", mean(crimeData$Violent.Crime.rate)) -``` - -```r -## [1] "mean rate: 346.81" -``` - -```r -sprintf("std of rate: %.2f", sd(crimeData$Violent.Crime.rate)) -``` - -```r -## [1] "std of rate: 128.82" -``` - -从右图[5.9](#fig:popVsCrime)中我们可以看出,加利福尼亚毕竟没有那么危险——它每 10 万人的犯罪率为 396.1,略高于 346.81 的平均值,但在许多其他州的范围内。但是,如果我们想更清楚地了解它与发行版的其他部分有多远呢? - -_z-score_ 允许我们以一种方式表示数据,从而更深入地了解每个数据点与整体分布的关系。如果我们知道总体平均值![](img/4e4d506c887c843f43a8fbcbe1884ffd.jpg)和标准差![](img/2469b2bd2a1ab19ebfcee223dcb52bb1.jpg)的值,则计算数据点 z 得分的公式为: - -![](img/8622fe3fbd8234f114c414fbf51c2618.jpg) - -直观地说,你可以把 z 值看作是告诉你离任何数据点的平均值有多远,以标准偏差为单位。我们可以根据犯罪率数据来计算,如图[5.10](#fig:crimeZplot)所示。 - -```r -## [1] "mean of Z-scored data: 1.4658413372004e-16" -``` - -```r -## [1] "std deviation of Z-scored data: 1" -``` - -![Scatterplot of original crime rate data against Z-scored data.](img/file22.png) - -图 5.10 原始犯罪率数据与 Z 评分数据的散点图。 - -散点图表明,z-得分的过程并没有改变数据点的相对分布(可以看到原始数据和 z-得分数据在相互作图时落在一条直线上),只是将它们移动到一个平均值为零和一个标准差。一个。然而,如果你仔细观察,你会发现平均值并不完全为零——只是非常小。这里所发生的是,计算机以一定的 _ 数字精度 _ 表示数字,这意味着有些数字不完全为零,但小到 R 认为它们为零。 - -```r -# examples of numerical precision - -print(paste("smallest number such that 1+x != 1", .Machine$double.eps)) -``` - -```r -## [1] "smallest number such that 1+x != 1 2.22044604925031e-16" -``` - -```r -# We can confirm this by showing that adding anything less than that number to -# 1 is treated as 1 by R -print((1 + .Machine$double.eps) == 1) -``` - -```r -## [1] FALSE -``` - -```r -print((1 + .Machine$double.eps / 2) == 1) -``` - -```r -## [1] TRUE -``` - -```r -# we can also look at the largest number -print(paste("largest number", .Machine$double.xmax)) -``` - -```r -## [1] "largest number 1.79769313486232e+308" -``` - -```r -# similarly here, we can see that adding 1 to the largest possible number -# is no different from the largest possible number, in R's eyes at least. -print((1 + .Machine$double.xmax) == .Machine$double.xmax) -``` - -```r -## [1] TRUE -``` - -图[5.11](#fig:crimeZmap)显示了使用地理视图的 Z 评分犯罪数据。 - -![Crime data rendered onto a US map, presented as Z-scores.](img/file23.png) - -图 5.11 呈现在美国地图上的犯罪数据,以 z 分数表示。 - -这为我们提供了一个稍微更具解释性的数据视图。例如,我们可以看到内华达州、田纳西州和新墨西哥州的犯罪率都比平均值高出大约两个标准差。 - -# - -## 5.9.1 解释 z-分数 - -“z-得分”中的“z”源于标准正态分布(即平均值为零且标准偏差为 1 的正态分布)通常被称为“z”分布。我们可以使用标准正态分布来帮助我们了解相对于分布的其余部分,特定的 z 分数告诉我们数据点的位置。 - -![Density (top) and cumulative distribution (bottom) of a standard normal distribution, with cutoffs at one standard deviation above/below the mean.](img/file24.png) - -图 5.12 标准正态分布的密度(顶部)和累积分布(底部),在平均值以上/以下的一个标准偏差处进行截止。 - -图[5.12](#fig:zDensityCDF)中的上面板显示,我们预计约 16%的值会落在![](img/67237d3f9b5b8a31ea44a87184389bb5.jpg)中,同样的比例也会落在![](img/88cf7506d0716660caaec77acb51a9c7.jpg)中。 - -![Density (top) and cumulative distribution (bottom) of a standard normal distribution, with cutoffs at two standard deviations above/below the mean](img/file25.png) - -图 5.13 标准正态分布的密度(顶部)和累积分布(底部),平均值以上/以下两个标准偏差处的截止值 - -图[5.13](#fig:zDensity2SD)显示了两个标准偏差的相同曲线图。在这里,我们看到只有约 2.3%的值落在![](img/68ba2813e97287d88b6694f681aed629.jpg)中,同样的也落在![](img/9817dc62b48fd93386eb42f43f1d3e2c.jpg)中。因此,如果我们知道特定数据点的 z 值,我们可以估计找到一个值的可能性或可能性有多大,至少与该值一样极端,这样我们就可以将值放入更好的上下文中。 - -# - -## 5.9.2 标准化评分 - -假设我们希望生成平均值为 100、标准差为 10 的标准化犯罪评分,而不是 Z 评分。这类似于用智力测验的分数来产生智力商数(IQ)的标准化。我们可以简单地将 z 分数乘以 10,然后再加 100。 - -```r -## [1] "mean of standardized score data: 100" -``` - -```r -## [1] "std deviation of standardized score data: 10" -``` - -![Crime data presented as standardized scores with mean of 100 and standard deviation of 10.](img/file26.png) - -图 5.14 犯罪数据以标准化分数呈现,平均值为 100,标准差为 10。 - -## - -## 5.9.2.1 使用 z 分比较分布 - -z 值的一个有用的应用是比较不同变量的分布。假设我们想比较暴力犯罪和财产犯罪在各州的分布情况。在图[5.15](#fig:crimeTypePlot)的左面板中,我们将这些图形绘制在一起,用蓝色绘制 CA。正如你所看到的,财产犯罪的原始率远远高于暴力犯罪的原始率,所以我们不能直接比较数字。但是,我们可以将这些数据的 z 值相互绘制出来(图[5.15](#fig:crimeTypePlot)的右面板)——这里我们再次看到数据的分布没有改变。把每一个变量的数据放入 z 值后,就可以进行比较了,让我们看到加州实际上处于暴力犯罪和财产犯罪分布的中间。 - -![Plot of violent vs. property crime rates (left) and Z-scored rates (right).](img/file27.png) - -图 5.15 暴力与财产犯罪率(左)和 Z 得分率(右)的曲线图。 - -让我们再给情节加一个因素:人口。在图[5.16](#fig:crimeTypePopPlot)的左面板中,我们使用绘图符号的大小来显示这一点,这通常是向绘图添加信息的一种有用方法。 - -![Left: Plot of violent vs. property crime rates, with population size presented through the size of the plotting symbol; California is presented in blue. Right: Difference scores for violent vs. property crime, plotted against population. ](img/file28.png) - -图 5.16 左图:暴力犯罪率与财产犯罪率的对比图,人口规模以绘图符号的大小表示;加利福尼亚州以蓝色表示。对:针对人口的暴力和财产犯罪的得分差异。 - -因为 z 分数是直接可比的,所以我们也可以计算“暴力差异”分数,该分数表示各州暴力与非暴力(财产)犯罪的相对比率。然后我们可以将这些得分与人口进行对比(参见图[5.16](#fig:crimeTypePopPlot)的右面板)。这说明我们如何使用 z-分数将不同的变量放在一个共同的尺度上。 - -值得注意的是,最小的国家在两个方向上的差异似乎最大。虽然这可能会吸引我们去观察每一个状态,并试图确定为什么它有一个高或低的差异分数,但这可能反映了这样一个事实,即从较小的样本中获得的估计值必然会有更多的变量,正如我们将在几章中更详细地讨论的那样。 \ No newline at end of file diff --git a/docs/6.md b/docs/6.md index e1e0d90aa4c3bdcfe98e2a6ebde8f2b04ff5b217..4fe6067aeffa0be0fcb0d0e4ba68244b9e981331 100644 --- a/docs/6.md +++ b/docs/6.md @@ -1,3 +1,214 @@ # 6 数据可视化 -对于数据集,我们可以做的最重要的事情之一是查看它,但是有许多方法可以查看数据,其中一些方法比其他方法更有效。在本章中,我们将讨论如何有效地可视化数据。 \ No newline at end of file +对于数据集,我们可以做的最重要的事情之一是查看它,但是有许多方法可以查看数据,其中一些方法比其他方法更有效。在本章中,我们将讨论如何有效地可视化数据。 + +## 6.1 数据可视化如何拯救生命 + +1986 年 1 月 28 日,挑战者号航天飞机在起飞 73 秒后爆炸,机上 7 名宇航员全部遇难。事故发生后,对事故原因进行了正式调查,发现连接固体火箭助推器两段的 O 形圈发生泄漏,导致大型液体燃料箱接头失效、爆炸(见图[6.1[HTG1 页)。](#fig:srbLeak) + +![An image of the solid rocket booster leaking fuel, seconds before the explostion. By NASA (Great Images in NASA Description) [Public domain], via Wikimedia Commons](img/file29.jpg) + +图 6.1 爆炸前几秒固体火箭助推器泄漏燃料的图像。由美国国家航空航天局(美国国家航空航天局描述的伟大图像)【公共领域】,通过维基共享资源 + +调查发现,美国航天局决策过程的许多方面都存在缺陷,特别是在美国航天局工作人员和建造固体火箭助推器的承包商莫顿·齐奥科尔的工程师之间举行的一次会议上。这些工程师特别关注,因为据预测,发射当天早上的温度很低,而且他们从先前发射的数据中发现,O 型环的性能在较低的温度下受到了影响。在发射前一天晚上的一次会议上,工程师们向美国宇航局的管理人员展示了他们的数据,但无法说服他们推迟发射。 + +可视化专家 EdwardTufte 认为,如果能正确地展示所有数据,工程师们可能会更有说服力。特别是,他们可以展示一个像图[6.2](#fig:challengerTemps)所示的数字,这突出了两个重要事实。首先,它表明,O 型环的损伤量(定义为固体火箭助推器在以前的飞行中从海洋中回收后在环外发现的腐蚀和烟尘量)与起飞时的温度密切相关。第二,它显示 1 月 28 日上午的预测温度范围(显示在红色阴影区域)远远超出了之前所有发射的范围。虽然我们不能确定,但至少似乎可以相信,这可能更有说服力。 + +![A replotting of Tufte's damage index data. The blue line shows the trend in the data, and the red patch shows the projected temperatures for the morning of the launch.](img/file30.png) + +图 6.2 复刻凝灰岩损伤指数数据。蓝色的线显示了数据的趋势,红色的补丁显示了发射早晨的预计温度。 + +## 6.10 其他因素的修正 + +通常,我们对绘制感兴趣的变量受我们感兴趣的因素以外的其他因素影响的数据感兴趣。例如,假设我们想了解汽油价格随时间的变化。图[6.16](#fig:gasPrices)显示了历史天然气价格数据,绘制了通货膨胀调整或不调整。虽然未经调整的数据显示大幅增长,但经调整的数据显示,这主要是通胀的反映。其他需要根据其他因素调整数据的例子包括人口规模(如前一章中的犯罪率示例所示)和不同季节收集的数据。 + +![The price of gasoline in the US from 1930 to 201 (obtained from http://www.thepeoplehistory.com/70yearsofpricechange.html) with or without correction for inflation (based on Consumer Price Index).](img/file44.png) + +图 6.16 美国 1930-201 年汽油价格(从[http://www.thepoplehistory.com/70yearsofpricechange.html](http://www.thepeoplehistory.com/70yearsofpricechange.html)获得),有无通货膨胀修正(基于消费者价格指数)。 + +## 6.11 建议阅读和视频 + +* [_ 数据可视化基础 _](https://serialmentor.com/dataviz/),克劳斯·威尔克著 +* _ 视觉解释 _,Edward Tufte 著 +* _ 可视化数据 _,作者:William S.Cleveland +* _ 眼与心的图形设计 _,斯蒂芬·M·科斯林著 +* [_ 人类如何看待数据 _](https://www.youtube.com/watch?v=fSgEeI2Xpdc&feature=youtu.be),作者:约翰·劳瑟 + +## 6.2 绘图解剖 + +绘制数据的目的是以二维(有时是三维)表示形式呈现数据集的摘要。我们将尺寸称为 _ 轴 _——水平轴称为 _X 轴 _,垂直轴称为 _Y 轴 _。我们可以按照突出显示数据值的方式沿轴排列数据。这些值可以是连续的,也可以是分类的。 + +我们可以使用许多不同类型的地块,它们有不同的优点和缺点。假设我们有兴趣在 nhanes 数据集中描述男女身高差异。图[6.3](#fig:plotHeight)显示了绘制这些数据的四种不同方法。 + +1. 面板 A 中的条形图显示了平均值的差异,但没有显示这些平均值周围的数据分布有多广——正如我们稍后将看到的,了解这一点对于确定我们认为两组之间的差异是否足够大而重要至关重要。 + +2. 第二个图显示了所有数据点重叠的条形图——这使得男性和女性的身高分布重叠更加清晰,但由于数据点数量众多,仍然很难看到。 + +一般来说,我们更喜欢使用一种绘图技术,它可以清楚地显示数据点的分布情况。 + +1. 在面板 C 中,我们看到一个清晰显示数据点的例子,称为 _ 小提琴图 _,它绘制了每种情况下的数据分布(经过一点平滑处理)。 + +2. 另一个选项是面板 D 中显示的 _ 方框图 _,它显示了中间值(中心线)、可变性测量值(方框宽度,基于称为四分位范围的测量值)和任何异常值(由线条末端的点表示)。这两种方法都是显示数据的有效方法,为数据的分发提供了良好的感觉。 + +![Four different ways of plotting the difference in height between men and women in the NHANES dataset. Panel A plots the means of the two groups, which gives no way to assess the relative overlap of the two distributions. Panel B shows the same bars, but also overlays the data points, jittering them so that we can see their overall distribution. Panel C shows a violin plot, which shows the distribution of the datasets for each group. Panel D shows a box plot, which highlights the spread of the distribution along with any outliers (which are shown as individual points).](img/file31.png) + +图 6.3 nhanes 数据集中绘制男女身高差异的四种不同方法。面板 A 绘制了两组的平均值,这无法评估两个分布的相对重叠。面板 B 显示了相同的条,但也覆盖了数据点,使它们抖动,以便我们可以看到它们的总体分布。面板 C 显示了小提琴图,显示了每组数据集的分布。面板 D 显示了一个方框图,它突出了分布的分布以及任何异常值(显示为单个点)。 + +## 6.3 使用 ggplot 在 R 中绘制 + +在 R 中有许多不同的绘制数据的工具,但我们将重点关注由名为`ggplot2`的包提供的`ggplot()`函数。ggplot 是非常强大的,但是使用它需要了解它的工作原理。 + +假设我们要创建一个 _ 散点图 _,该散点图绘制了每个成年人的身高和体重,样本来自 nhanes 数据集的 150 人,不同的标记用于表示男性和女性。首先,我们创建示例: + +```r +NHANES_sample <- + NHANES_adult %>% + drop_na(Weight, Gender) %>% #remove rows (individuals) with missing values for Weight and Gender + sample_n(150) #take a random sample of n = 150 rows (individuals) +``` + +现在让我们设置`ggplot()`命令。这需要我们具体说明两件事。首先,我们需要告诉它从哪个数据帧获取数据(在本例中是`NHANES_sample`)。其次,我们需要通过 _ 美学 _ 函数`aes()`来告诉它要使用的数据框架中的哪些变量。在这种情况下,我们要绘制 X 轴上的高度和 Y 轴上的权重。结果如图[6.4](#fig:emptyPlot)所示:该命令生成一组绘图轴,但实际上没有显示任何数据。 + +```r +NHANES_sample %>% + ggplot(aes(x = Height, y = Weight)) +``` + +![Empty plot frame generated by ggplot()](img/file32.png) + +图 6.4 由 ggplot()生成的空图框 + +接下来我们需要添加数据的表示。我们告诉`ggplot`要显示什么的方法是向主`ggplot()`命令添加各种命令。特别是,我们通常需要添加一个 _ 几何体 _ 或“geom”,它指定如何在绘图中排列数据。例如,为了显示每个数据点,我们可以使用`geom_point()`几何图形,如图[6.5](#fig:simpleGeom)所示。每个数据点代表我们的`NHANES_sample`数据集中的一个单独的行,每个行对应于这个数据集中的一个人。 + +```r +NHANES_sample %>% + ggplot(aes(x = Height, y = Weight)) + + geom_point() +``` + +![Simple scatter plot](img/file33.png) + +图 6.5 简单散点图 + +最后,我们要根据不同的性别用不同的颜色绘制点。我们只需在美学中添加一个 _ 颜色 _ 关键字,它告诉`geom_point()`函数按性别分开颜色点。如图[6.6](#fig:colorPoints)所示。这个图还显示了一个示例,说明了如何在一个图中包含多个几何层——在本例中,我们使用`geom_smooth()`分别按性别绘制最能描述身高和体重之间关系的线。线条周围的阴影反映了我们对当时估计的信心。 + +```r +NHANES_sample %>% + ggplot(aes(x = Height, y = Weight, color = Gender)) + + geom_point() + + geom_smooth(method = "lm") +``` + +![Scatterplot with points separately colored by Gender.](img/file34.png) + +图 6.6 散点图,各点按性别分别着色。 + +## 6.4 良好可视化原则 + +许多书都是关于数据的有效可视化的。有一些原则是大多数作者都同意的,而其他的则更具争议性。这里我们总结了一些主要原则;如果您想了解更多,那么在本章末尾的 _ 建议阅读 _ 部分列出了一些很好的资源。 + +下面是我们对数据可视化的一些重要原则的提炼。 + +# + +## 6.4.1 展示数据并使其脱颖而出 + +假设我做了一项研究,研究了牙齿健康和使用牙线的时间之间的关系,我想把我的数据形象化。图[6.7](#fig:dentalFigs)显示了这些数据的四种可能的表示。 + +1. 在面板 A 中,我们实际上并不显示数据,只是一条表示数据之间关系的线。这显然不是最佳的,因为我们实际上看不到底层数据是什么样子的。 + +面板 B-D 显示了绘制实际数据的三种可能结果,其中每个绘图显示了可能生成数据的不同方式。 + +1. 如果我们看到面板 B 中的情节,我们可能会怀疑——真实数据很少会遵循如此精确的模式。 + +2. 另一方面,面板 C 中的数据看起来像真实的数据——它们显示了一种总体趋势,但是它们是混乱的,就像世界上通常的数据一样。 + +3. 面板 D 中的数据表明,两个变量之间的明显关系仅仅是由一个个体引起的,我们称之为 _ 离群值 _,因为它们远远超出了组内其他变量的模式。很明显,我们可能不想从由一个数据点驱动的效果得出很多结论。此图强调了为什么 _ 总是 _ 重要的原因,即在过于相信任何数据摘要之前查看原始数据。 + +![Four different possible presentations of data for the dental health example. Each point in the scatter plot represents one data point in the dataset, and the line in each plot represents the linear trend in the data.](img/file35.png) + +图 6.7 牙齿健康示例的四种不同可能数据表示。散点图中的每个点表示数据集中的一个数据点,每个图中的线表示数据中的线性趋势。 + +## 6.5 最大化数据/墨水比 + +Edward Tufte 提出了一个称为数据/墨水比的想法: + +![](img/53ec50573426da0a20d7442881d47b5f.jpg) + +这样做的目的是最小化视觉混乱,让数据显示出来。例如,以图[6.8](#fig:dataInkExample)中牙齿健康数据的两个演示为例。两个面板显示相同的数据,但面板 A 更容易理解,因为它的数据/墨水比率相对较高。 + +![An example of the same data plotted with two different data/ink ratios.](img/file36.png) + +图 6.8 用两个不同的数据/墨水比绘制的相同数据示例。 + +## 6.6 避免图表垃圾 + +特别常见的是,在流行媒体中看到数据的展示,这些展示带有许多视觉元素,这些元素在主题上与内容相关,但与实际数据无关。这被称为 _chartjunk_,应该不惜一切代价避免。 + +避免图表垃圾的一个好方法是避免使用流行的电子表格程序绘制数据。例如,图[6.9](#fig:chartJunk)(使用 Microsoft Excel 创建)中的图表描绘了美国不同宗教的相对流行程度。这个数字至少有三个问题: + +* 它在每根与实际数据无关的条上都覆盖了图形。 +* 它有一个分散的背景纹理。 +* 它使用三维条形图 + +![An example of chart junk.](img/file37.png) + +图 6.9 图表垃圾示例。 + +## 6.7 避免数据失真 + +通常可以使用可视化来扭曲数据集的消息。一个非常常见的方法是使用不同的轴缩放来放大或隐藏数据模式。例如,假设我们有兴趣看看美国的暴力犯罪率是否发生了变化。在图[6.10](#fig:crimePlotAxes)中,我们可以看到这些数据的绘制方式,要么使犯罪看起来保持不变,要么使犯罪率下降。相同的数据可以讲述两个截然不同的故事! + +![Crime data from 1990 to 2014 plotted over time. Panels A and B show the same data, but with different axis ranges. Data obtained from https://www.ucrdatatool.gov/Search/Crime/State/RunCrimeStatebyState.cfm](img/file38.png) + +图 6.10 1990 年至 2014 年犯罪数据随时间的推移绘制。面板 A 和 B 显示相同的数据,但具有不同的轴范围。从[获取的数据 https://www.ucrdatatool.gov/search/crime/state/runcrimestatebystate.cfm](https://www.ucrdatatool.gov/Search/Crime/State/RunCrimeStatebyState.cfm) + +统计数据可视化中的一个主要争议是如何选择 Y 轴,尤其是它是否应该总是包含零。达雷尔·赫夫在他的著名著作《如何用统计数字撒谎》中强烈主张,在 Y 轴上应该始终包括零点。另一方面,爱德华·塔夫特反对这一观点: + +> “一般来说,在一个时间序列中,使用一个显示数据而不是零点的基线;不要花费大量的空白垂直空间试图以隐藏数据行本身所发生的事情为代价达到零点。”(摘自[https://qz.com/418083/its-ok-not-to-start-your-y 轴-at-zero/](https://qz.com/418083/its-ok-not-to-start-your-y-axis-at-zero/)) + +在某些情况下,使用零点毫无意义。假设我们有兴趣绘制一个人随时间变化的体温。在图[6.11](#fig:bodyTempAxis)中,我们绘制了 Y 轴上有零或无零的相同(模拟)数据。很明显,通过在 Y 轴(图 A)上绘制这些数据为零,我们在图中浪费了大量的空间,因为活人的体温永远不会降到零!通过包括零,我们也使得 21-30 天明显的温度跃升变得不那么明显。一般来说,我对于线图和散点图的倾向是使用图中的所有空间,除非零点真正重要到需要突出显示。 + +![Body temperature over time, plotted with or without the zero point in the Y axis.](img/file39.png) + +图 6.11 随时间变化的体温,在 Y 轴上绘制有或没有零点。 + +## 6.8 谎言因素 + +爱德华塔夫特引入了“谎言因素”的概念来描述可视化中的物理差异与数据差异大小的对应程度。如果图形的谎言因子接近 1,则它适当地表示数据,而谎言因子远离 1 则反映基础数据的失真。 + +谎言因素支持这样的论点:在许多情况下,一个人应该总是在条形图中包含零点。在图[6.12](#fig:barCharLieFactor)中,我们绘制了 Y 轴上有零和无零的相同数据。在面板 A 中,两条钢筋之间的面积比例差与值之间的比例差(即:Lie 系数=1)完全相同,而在面板 B(不包括零)中,两条钢筋之间的面积比例差大约是 2.8 倍于值的比例差异,因此它在视觉上夸大了差异的大小。 + +![Two bar charts with associated lie factors.](img/file40.png) + +图 6.12 两个条形图及相关的测谎系数。 + +## 6.9 记住人的局限性 + +人类既有知觉的局限性,也有认知的局限性,这使得一些可视化很难理解。在构建可视化时,务必记住这些内容。 + +# + +## 6.9.1 知觉限制 + +许多人(包括我自己)所遭受的一个重要的知觉限制是色盲。这使得很难感知图形中的信息(如图[6.13](#fig:badColors)中的信息),其中元素之间只有颜色对比,但没有亮度对比。除了颜色之外,使用亮度和/或纹理有很大差别的图形元素总是很有帮助的。还有[“色盲友好型”调色板](http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/#a-colorblind-friendly-palette)可用于 R + +![Example of a bad figure that relies solely on color contrast.](img/file41.png) + +图 6.13 仅依赖颜色对比度的坏图形示例。 + +即使对于拥有完美色觉的人来说,也存在一些知觉上的限制,使得某些情节无效。这就是统计学家从不使用饼图的原因之一:人类很难理解形状体积的差异。图[6.14](#fig:pieChart)中的饼图(显示了与上面显示的宗教信仰相同的数据)显示了这有多复杂。 + +![An example of a pie chart, highlighting the difficult in apprehending the relative volume of the different pie slices.](img/file42.png) + +图 6.14 饼图的一个例子,强调了理解不同饼图切片的相对体积的困难。 + +这个阴谋很可怕,有几个原因。首先,它需要将大量的颜色与图形底部非常小的补丁区分开。第二,视觉角度扭曲了相对数字,因此天主教的饼状楔形比无饼状楔形要大得多,而事实上,无饼状楔形的数字稍大(22.8%对 20.8%),如图[6.9](#fig:chartJunk)所示。第三,通过将图例与图形分开,它要求查看器将信息保存在工作内存中,以便在图形和图例之间进行映射,并进行许多“表查找”,以便不断将图例标签与可视化匹配。最后,它使用的文本太小,不放大就无法阅读。 + +使用更合理的方法绘制数据(图[6.15](#fig:religionBars)),我们可以更清楚地看到模式。此图可能不像使用 Excel 生成的饼图那样华丽,但它更有效、更准确地表示了数据。 + +![A clearer presentation of the religious affiliation data (obtained from http://www.pewforum.org/religious-landscape-study/).](img/file43.png) + +图 6.15 更清晰地展示了宗教隶属关系数据(摘自[http://www.pewforum.org/steerial-landscape-study/](http://www.pewforum.org/religious-landscape-study/))。 + +此图允许查看者根据杆**的**长度**沿公共比例**(Y 轴)进行比较。在基于这些感知元素解码差异时,人类往往比基于区域或颜色更准确。 \ No newline at end of file diff --git a/docs/6.x2.md b/docs/6.x2.md deleted file mode 100644 index 4fe6067aeffa0be0fcb0d0e4ba68244b9e981331..0000000000000000000000000000000000000000 --- a/docs/6.x2.md +++ /dev/null @@ -1,214 +0,0 @@ -# 6 数据可视化 - -对于数据集,我们可以做的最重要的事情之一是查看它,但是有许多方法可以查看数据,其中一些方法比其他方法更有效。在本章中,我们将讨论如何有效地可视化数据。 - -## 6.1 数据可视化如何拯救生命 - -1986 年 1 月 28 日,挑战者号航天飞机在起飞 73 秒后爆炸,机上 7 名宇航员全部遇难。事故发生后,对事故原因进行了正式调查,发现连接固体火箭助推器两段的 O 形圈发生泄漏,导致大型液体燃料箱接头失效、爆炸(见图[6.1[HTG1 页)。](#fig:srbLeak) - -![An image of the solid rocket booster leaking fuel, seconds before the explostion. By NASA (Great Images in NASA Description) [Public domain], via Wikimedia Commons](img/file29.jpg) - -图 6.1 爆炸前几秒固体火箭助推器泄漏燃料的图像。由美国国家航空航天局(美国国家航空航天局描述的伟大图像)【公共领域】,通过维基共享资源 - -调查发现,美国航天局决策过程的许多方面都存在缺陷,特别是在美国航天局工作人员和建造固体火箭助推器的承包商莫顿·齐奥科尔的工程师之间举行的一次会议上。这些工程师特别关注,因为据预测,发射当天早上的温度很低,而且他们从先前发射的数据中发现,O 型环的性能在较低的温度下受到了影响。在发射前一天晚上的一次会议上,工程师们向美国宇航局的管理人员展示了他们的数据,但无法说服他们推迟发射。 - -可视化专家 EdwardTufte 认为,如果能正确地展示所有数据,工程师们可能会更有说服力。特别是,他们可以展示一个像图[6.2](#fig:challengerTemps)所示的数字,这突出了两个重要事实。首先,它表明,O 型环的损伤量(定义为固体火箭助推器在以前的飞行中从海洋中回收后在环外发现的腐蚀和烟尘量)与起飞时的温度密切相关。第二,它显示 1 月 28 日上午的预测温度范围(显示在红色阴影区域)远远超出了之前所有发射的范围。虽然我们不能确定,但至少似乎可以相信,这可能更有说服力。 - -![A replotting of Tufte's damage index data. The blue line shows the trend in the data, and the red patch shows the projected temperatures for the morning of the launch.](img/file30.png) - -图 6.2 复刻凝灰岩损伤指数数据。蓝色的线显示了数据的趋势,红色的补丁显示了发射早晨的预计温度。 - -## 6.10 其他因素的修正 - -通常,我们对绘制感兴趣的变量受我们感兴趣的因素以外的其他因素影响的数据感兴趣。例如,假设我们想了解汽油价格随时间的变化。图[6.16](#fig:gasPrices)显示了历史天然气价格数据,绘制了通货膨胀调整或不调整。虽然未经调整的数据显示大幅增长,但经调整的数据显示,这主要是通胀的反映。其他需要根据其他因素调整数据的例子包括人口规模(如前一章中的犯罪率示例所示)和不同季节收集的数据。 - -![The price of gasoline in the US from 1930 to 201 (obtained from http://www.thepeoplehistory.com/70yearsofpricechange.html) with or without correction for inflation (based on Consumer Price Index).](img/file44.png) - -图 6.16 美国 1930-201 年汽油价格(从[http://www.thepoplehistory.com/70yearsofpricechange.html](http://www.thepeoplehistory.com/70yearsofpricechange.html)获得),有无通货膨胀修正(基于消费者价格指数)。 - -## 6.11 建议阅读和视频 - -* [_ 数据可视化基础 _](https://serialmentor.com/dataviz/),克劳斯·威尔克著 -* _ 视觉解释 _,Edward Tufte 著 -* _ 可视化数据 _,作者:William S.Cleveland -* _ 眼与心的图形设计 _,斯蒂芬·M·科斯林著 -* [_ 人类如何看待数据 _](https://www.youtube.com/watch?v=fSgEeI2Xpdc&feature=youtu.be),作者:约翰·劳瑟 - -## 6.2 绘图解剖 - -绘制数据的目的是以二维(有时是三维)表示形式呈现数据集的摘要。我们将尺寸称为 _ 轴 _——水平轴称为 _X 轴 _,垂直轴称为 _Y 轴 _。我们可以按照突出显示数据值的方式沿轴排列数据。这些值可以是连续的,也可以是分类的。 - -我们可以使用许多不同类型的地块,它们有不同的优点和缺点。假设我们有兴趣在 nhanes 数据集中描述男女身高差异。图[6.3](#fig:plotHeight)显示了绘制这些数据的四种不同方法。 - -1. 面板 A 中的条形图显示了平均值的差异,但没有显示这些平均值周围的数据分布有多广——正如我们稍后将看到的,了解这一点对于确定我们认为两组之间的差异是否足够大而重要至关重要。 - -2. 第二个图显示了所有数据点重叠的条形图——这使得男性和女性的身高分布重叠更加清晰,但由于数据点数量众多,仍然很难看到。 - -一般来说,我们更喜欢使用一种绘图技术,它可以清楚地显示数据点的分布情况。 - -1. 在面板 C 中,我们看到一个清晰显示数据点的例子,称为 _ 小提琴图 _,它绘制了每种情况下的数据分布(经过一点平滑处理)。 - -2. 另一个选项是面板 D 中显示的 _ 方框图 _,它显示了中间值(中心线)、可变性测量值(方框宽度,基于称为四分位范围的测量值)和任何异常值(由线条末端的点表示)。这两种方法都是显示数据的有效方法,为数据的分发提供了良好的感觉。 - -![Four different ways of plotting the difference in height between men and women in the NHANES dataset. Panel A plots the means of the two groups, which gives no way to assess the relative overlap of the two distributions. Panel B shows the same bars, but also overlays the data points, jittering them so that we can see their overall distribution. Panel C shows a violin plot, which shows the distribution of the datasets for each group. Panel D shows a box plot, which highlights the spread of the distribution along with any outliers (which are shown as individual points).](img/file31.png) - -图 6.3 nhanes 数据集中绘制男女身高差异的四种不同方法。面板 A 绘制了两组的平均值,这无法评估两个分布的相对重叠。面板 B 显示了相同的条,但也覆盖了数据点,使它们抖动,以便我们可以看到它们的总体分布。面板 C 显示了小提琴图,显示了每组数据集的分布。面板 D 显示了一个方框图,它突出了分布的分布以及任何异常值(显示为单个点)。 - -## 6.3 使用 ggplot 在 R 中绘制 - -在 R 中有许多不同的绘制数据的工具,但我们将重点关注由名为`ggplot2`的包提供的`ggplot()`函数。ggplot 是非常强大的,但是使用它需要了解它的工作原理。 - -假设我们要创建一个 _ 散点图 _,该散点图绘制了每个成年人的身高和体重,样本来自 nhanes 数据集的 150 人,不同的标记用于表示男性和女性。首先,我们创建示例: - -```r -NHANES_sample <- - NHANES_adult %>% - drop_na(Weight, Gender) %>% #remove rows (individuals) with missing values for Weight and Gender - sample_n(150) #take a random sample of n = 150 rows (individuals) -``` - -现在让我们设置`ggplot()`命令。这需要我们具体说明两件事。首先,我们需要告诉它从哪个数据帧获取数据(在本例中是`NHANES_sample`)。其次,我们需要通过 _ 美学 _ 函数`aes()`来告诉它要使用的数据框架中的哪些变量。在这种情况下,我们要绘制 X 轴上的高度和 Y 轴上的权重。结果如图[6.4](#fig:emptyPlot)所示:该命令生成一组绘图轴,但实际上没有显示任何数据。 - -```r -NHANES_sample %>% - ggplot(aes(x = Height, y = Weight)) -``` - -![Empty plot frame generated by ggplot()](img/file32.png) - -图 6.4 由 ggplot()生成的空图框 - -接下来我们需要添加数据的表示。我们告诉`ggplot`要显示什么的方法是向主`ggplot()`命令添加各种命令。特别是,我们通常需要添加一个 _ 几何体 _ 或“geom”,它指定如何在绘图中排列数据。例如,为了显示每个数据点,我们可以使用`geom_point()`几何图形,如图[6.5](#fig:simpleGeom)所示。每个数据点代表我们的`NHANES_sample`数据集中的一个单独的行,每个行对应于这个数据集中的一个人。 - -```r -NHANES_sample %>% - ggplot(aes(x = Height, y = Weight)) + - geom_point() -``` - -![Simple scatter plot](img/file33.png) - -图 6.5 简单散点图 - -最后,我们要根据不同的性别用不同的颜色绘制点。我们只需在美学中添加一个 _ 颜色 _ 关键字,它告诉`geom_point()`函数按性别分开颜色点。如图[6.6](#fig:colorPoints)所示。这个图还显示了一个示例,说明了如何在一个图中包含多个几何层——在本例中,我们使用`geom_smooth()`分别按性别绘制最能描述身高和体重之间关系的线。线条周围的阴影反映了我们对当时估计的信心。 - -```r -NHANES_sample %>% - ggplot(aes(x = Height, y = Weight, color = Gender)) + - geom_point() + - geom_smooth(method = "lm") -``` - -![Scatterplot with points separately colored by Gender.](img/file34.png) - -图 6.6 散点图,各点按性别分别着色。 - -## 6.4 良好可视化原则 - -许多书都是关于数据的有效可视化的。有一些原则是大多数作者都同意的,而其他的则更具争议性。这里我们总结了一些主要原则;如果您想了解更多,那么在本章末尾的 _ 建议阅读 _ 部分列出了一些很好的资源。 - -下面是我们对数据可视化的一些重要原则的提炼。 - -# - -## 6.4.1 展示数据并使其脱颖而出 - -假设我做了一项研究,研究了牙齿健康和使用牙线的时间之间的关系,我想把我的数据形象化。图[6.7](#fig:dentalFigs)显示了这些数据的四种可能的表示。 - -1. 在面板 A 中,我们实际上并不显示数据,只是一条表示数据之间关系的线。这显然不是最佳的,因为我们实际上看不到底层数据是什么样子的。 - -面板 B-D 显示了绘制实际数据的三种可能结果,其中每个绘图显示了可能生成数据的不同方式。 - -1. 如果我们看到面板 B 中的情节,我们可能会怀疑——真实数据很少会遵循如此精确的模式。 - -2. 另一方面,面板 C 中的数据看起来像真实的数据——它们显示了一种总体趋势,但是它们是混乱的,就像世界上通常的数据一样。 - -3. 面板 D 中的数据表明,两个变量之间的明显关系仅仅是由一个个体引起的,我们称之为 _ 离群值 _,因为它们远远超出了组内其他变量的模式。很明显,我们可能不想从由一个数据点驱动的效果得出很多结论。此图强调了为什么 _ 总是 _ 重要的原因,即在过于相信任何数据摘要之前查看原始数据。 - -![Four different possible presentations of data for the dental health example. Each point in the scatter plot represents one data point in the dataset, and the line in each plot represents the linear trend in the data.](img/file35.png) - -图 6.7 牙齿健康示例的四种不同可能数据表示。散点图中的每个点表示数据集中的一个数据点,每个图中的线表示数据中的线性趋势。 - -## 6.5 最大化数据/墨水比 - -Edward Tufte 提出了一个称为数据/墨水比的想法: - -![](img/53ec50573426da0a20d7442881d47b5f.jpg) - -这样做的目的是最小化视觉混乱,让数据显示出来。例如,以图[6.8](#fig:dataInkExample)中牙齿健康数据的两个演示为例。两个面板显示相同的数据,但面板 A 更容易理解,因为它的数据/墨水比率相对较高。 - -![An example of the same data plotted with two different data/ink ratios.](img/file36.png) - -图 6.8 用两个不同的数据/墨水比绘制的相同数据示例。 - -## 6.6 避免图表垃圾 - -特别常见的是,在流行媒体中看到数据的展示,这些展示带有许多视觉元素,这些元素在主题上与内容相关,但与实际数据无关。这被称为 _chartjunk_,应该不惜一切代价避免。 - -避免图表垃圾的一个好方法是避免使用流行的电子表格程序绘制数据。例如,图[6.9](#fig:chartJunk)(使用 Microsoft Excel 创建)中的图表描绘了美国不同宗教的相对流行程度。这个数字至少有三个问题: - -* 它在每根与实际数据无关的条上都覆盖了图形。 -* 它有一个分散的背景纹理。 -* 它使用三维条形图 - -![An example of chart junk.](img/file37.png) - -图 6.9 图表垃圾示例。 - -## 6.7 避免数据失真 - -通常可以使用可视化来扭曲数据集的消息。一个非常常见的方法是使用不同的轴缩放来放大或隐藏数据模式。例如,假设我们有兴趣看看美国的暴力犯罪率是否发生了变化。在图[6.10](#fig:crimePlotAxes)中,我们可以看到这些数据的绘制方式,要么使犯罪看起来保持不变,要么使犯罪率下降。相同的数据可以讲述两个截然不同的故事! - -![Crime data from 1990 to 2014 plotted over time. Panels A and B show the same data, but with different axis ranges. Data obtained from https://www.ucrdatatool.gov/Search/Crime/State/RunCrimeStatebyState.cfm](img/file38.png) - -图 6.10 1990 年至 2014 年犯罪数据随时间的推移绘制。面板 A 和 B 显示相同的数据,但具有不同的轴范围。从[获取的数据 https://www.ucrdatatool.gov/search/crime/state/runcrimestatebystate.cfm](https://www.ucrdatatool.gov/Search/Crime/State/RunCrimeStatebyState.cfm) - -统计数据可视化中的一个主要争议是如何选择 Y 轴,尤其是它是否应该总是包含零。达雷尔·赫夫在他的著名著作《如何用统计数字撒谎》中强烈主张,在 Y 轴上应该始终包括零点。另一方面,爱德华·塔夫特反对这一观点: - -> “一般来说,在一个时间序列中,使用一个显示数据而不是零点的基线;不要花费大量的空白垂直空间试图以隐藏数据行本身所发生的事情为代价达到零点。”(摘自[https://qz.com/418083/its-ok-not-to-start-your-y 轴-at-zero/](https://qz.com/418083/its-ok-not-to-start-your-y-axis-at-zero/)) - -在某些情况下,使用零点毫无意义。假设我们有兴趣绘制一个人随时间变化的体温。在图[6.11](#fig:bodyTempAxis)中,我们绘制了 Y 轴上有零或无零的相同(模拟)数据。很明显,通过在 Y 轴(图 A)上绘制这些数据为零,我们在图中浪费了大量的空间,因为活人的体温永远不会降到零!通过包括零,我们也使得 21-30 天明显的温度跃升变得不那么明显。一般来说,我对于线图和散点图的倾向是使用图中的所有空间,除非零点真正重要到需要突出显示。 - -![Body temperature over time, plotted with or without the zero point in the Y axis.](img/file39.png) - -图 6.11 随时间变化的体温,在 Y 轴上绘制有或没有零点。 - -## 6.8 谎言因素 - -爱德华塔夫特引入了“谎言因素”的概念来描述可视化中的物理差异与数据差异大小的对应程度。如果图形的谎言因子接近 1,则它适当地表示数据,而谎言因子远离 1 则反映基础数据的失真。 - -谎言因素支持这样的论点:在许多情况下,一个人应该总是在条形图中包含零点。在图[6.12](#fig:barCharLieFactor)中,我们绘制了 Y 轴上有零和无零的相同数据。在面板 A 中,两条钢筋之间的面积比例差与值之间的比例差(即:Lie 系数=1)完全相同,而在面板 B(不包括零)中,两条钢筋之间的面积比例差大约是 2.8 倍于值的比例差异,因此它在视觉上夸大了差异的大小。 - -![Two bar charts with associated lie factors.](img/file40.png) - -图 6.12 两个条形图及相关的测谎系数。 - -## 6.9 记住人的局限性 - -人类既有知觉的局限性,也有认知的局限性,这使得一些可视化很难理解。在构建可视化时,务必记住这些内容。 - -# - -## 6.9.1 知觉限制 - -许多人(包括我自己)所遭受的一个重要的知觉限制是色盲。这使得很难感知图形中的信息(如图[6.13](#fig:badColors)中的信息),其中元素之间只有颜色对比,但没有亮度对比。除了颜色之外,使用亮度和/或纹理有很大差别的图形元素总是很有帮助的。还有[“色盲友好型”调色板](http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/#a-colorblind-friendly-palette)可用于 R - -![Example of a bad figure that relies solely on color contrast.](img/file41.png) - -图 6.13 仅依赖颜色对比度的坏图形示例。 - -即使对于拥有完美色觉的人来说,也存在一些知觉上的限制,使得某些情节无效。这就是统计学家从不使用饼图的原因之一:人类很难理解形状体积的差异。图[6.14](#fig:pieChart)中的饼图(显示了与上面显示的宗教信仰相同的数据)显示了这有多复杂。 - -![An example of a pie chart, highlighting the difficult in apprehending the relative volume of the different pie slices.](img/file42.png) - -图 6.14 饼图的一个例子,强调了理解不同饼图切片的相对体积的困难。 - -这个阴谋很可怕,有几个原因。首先,它需要将大量的颜色与图形底部非常小的补丁区分开。第二,视觉角度扭曲了相对数字,因此天主教的饼状楔形比无饼状楔形要大得多,而事实上,无饼状楔形的数字稍大(22.8%对 20.8%),如图[6.9](#fig:chartJunk)所示。第三,通过将图例与图形分开,它要求查看器将信息保存在工作内存中,以便在图形和图例之间进行映射,并进行许多“表查找”,以便不断将图例标签与可视化匹配。最后,它使用的文本太小,不放大就无法阅读。 - -使用更合理的方法绘制数据(图[6.15](#fig:religionBars)),我们可以更清楚地看到模式。此图可能不像使用 Excel 生成的饼图那样华丽,但它更有效、更准确地表示了数据。 - -![A clearer presentation of the religious affiliation data (obtained from http://www.pewforum.org/religious-landscape-study/).](img/file43.png) - -图 6.15 更清晰地展示了宗教隶属关系数据(摘自[http://www.pewforum.org/steerial-landscape-study/](http://www.pewforum.org/religious-landscape-study/))。 - -此图允许查看者根据杆**的**长度**沿公共比例**(Y 轴)进行比较。在基于这些感知元素解码差异时,人类往往比基于区域或颜色更准确。 \ No newline at end of file diff --git a/docs/7.md b/docs/7.md index 111d9aa2fa75232d494cfa9764e7eb0cbb1f612d..1d55ba92918e3cac9da761712ecb92f2db5b3938 100644 --- a/docs/7.md +++ b/docs/7.md @@ -2,4 +2,256 @@ 统计学的一个基本观点是,我们可以根据一个相对较小的样本对整个人口进行推断。在本章中,我们将介绍统计抽样的概念,并讨论它的工作原理。 -任何居住在美国的人都将熟悉从政治投票中抽样的概念,这已成为我们选举过程的核心部分。在某些情况下,这些民意测验在预测选举结果方面可能非常准确。最著名的例子来自 2008 年和 2012 年的美国总统选举,当时民意测验专家奈特·西尔弗正确预测了 2008 年 49/50 个州和 2012 年全部 50 个州的选举结果。西尔弗通过结合来自 21 个不同民意调查的数据做到了这一点,这些数据在他们倾向于向共和党或民主党倾斜的程度上各不相同。这些民意调查中的每一项都包含了大约 1000 名可能的选民的数据——这意味着白银几乎能够利用仅有 21000 人的数据以及其他知识(例如,这些州过去的投票方式)完美地预测超过 1.25 亿选民的投票模式。 \ No newline at end of file +任何居住在美国的人都将熟悉从政治投票中抽样的概念,这已成为我们选举过程的核心部分。在某些情况下,这些民意测验在预测选举结果方面可能非常准确。最著名的例子来自 2008 年和 2012 年的美国总统选举,当时民意测验专家奈特·西尔弗正确预测了 2008 年 49/50 个州和 2012 年全部 50 个州的选举结果。西尔弗通过结合来自 21 个不同民意调查的数据做到了这一点,这些数据在他们倾向于向共和党或民主党倾斜的程度上各不相同。这些民意调查中的每一项都包含了大约 1000 名可能的选民的数据——这意味着白银几乎能够利用仅有 21000 人的数据以及其他知识(例如,这些州过去的投票方式)完美地预测超过 1.25 亿选民的投票模式。 + +## 7.1 我们如何取样? + +我们的抽样目标是确定感兴趣的全部人群的某些特征,只使用人群的一小部分。我们这样做主要是为了节省时间和精力——为什么要在仅仅一个小样本就足以准确估计兴趣变量的情况下,去测量人口中的每个个体呢? + +在选举的例子中,人口都是选民,样本是由投票组织选出的 1000 人组成的集合。我们选择样本的方式对于确保样本是整个人群的 _ 代表性 _ 至关重要,这是统计抽样的主要目标。很容易想象一个没有代表性的样本;如果一个民意测验者只打电话给那些他们从当地民主党收到名字的人,那么投票结果就不太可能代表整个人口。一般来说,我们将代表性投票定义为每个人口成员都有平等的机会被选中。如果这失败了,那么我们必须担心我们对样本计算的统计数据是否有 _ 偏差 _——也就是说,它的值是否系统地不同于总体值(我们称之为 _ 参数 _)。请记住,我们通常不知道这个人口参数,因为如果我们知道,那么就不需要采样了!但是,我们将使用能够接触到整个人口的例子来解释一些关键的想法。 + +同样重要的是要区分两种不同的取样方式:替换和不替换。在用替换物对 _ 进行采样时,在对某个群体成员进行采样后,将其放回池中,以便再次对其进行采样。在 _ 不替换的采样 _ 中,一旦对某个成员进行了采样,则该成员就没有资格再次进行采样。最常见的是使用不替换的采样,但在某些情况下,我们将使用带替换的采样,例如在[8](#resampling-and-simulation)章中讨论一种称为 _ 引导 _ 的技术。_ + +## 7.2 采样误差 + +不管我们的样本有多具有代表性,我们根据样本计算的统计数据很可能至少与总体参数略有不同。我们称之为 _ 采样误差 _。我们的统计估计值也会因样本而异;我们将我们的统计数据在样本间的分布称为 _ 抽样分布 _。 + +抽样误差直接关系到人口测量的质量。显然,我们希望从样本中获得的估计值尽可能接近总体参数的真实值。然而,即使我们的统计数据是无偏的(也就是说,从长远来看,我们希望它与总体参数具有相同的值),任何特定估计的值都将不同于总体估计,并且当抽样误差较大时,这些差异将更大。因此,减小采样误差是实现更好测量的重要步骤。 + +我们将使用 nhanes 数据集作为示例;我们将假设 nhanes 是整个总体,然后我们将从总体中随机抽取样本。在下一章中,我们将有更多的话要说,关于“随机”样本的生成是如何在计算机中工作的。 + +```r +# load the NHANES data library +library(NHANES) + +# create a NHANES dataset without duplicated IDs +NHANES <- + NHANES %>% + distinct(ID, .keep_all = TRUE) + +#create a dataset of only adults +NHANES_adult <- + NHANES %>% + filter( + !is.na(Height), + Age >= 18 + ) + +#print the NHANES population mean and standard deviation of adult height +sprintf( + "Population height: mean = %.2f", + mean(NHANES_adult$Height) +) +``` + +```r +## [1] "Population height: mean = 168.35" +``` + +```r +sprintf( + "Population height: std deviation = %.2f", + sd(NHANES_adult$Height) +) +``` + +```r +## [1] "Population height: std deviation = 10.16" +``` + +在这个例子中,我们知道成年人口的平均值和身高的标准偏差,因为我们假设 nhanes 数据集包含整个成年人口。现在,让我们从 NHANES 人群中抽取 50 个个体的单个样本,并将结果统计数据与人口参数进行比较。 + +```r +# sample 50 individuals from NHANES dataset +exampleSample <- + NHANES_adult %>% + sample_n(50) + +#print the sample mean and standard deviation of adult height +sprintf( + 'Sample height: mean = %.2f', + mean(exampleSample$Height) + ) +``` + +```r +## [1] "Sample height: mean = 169.46" +``` + +```r +sprintf( + 'Sample height: std deviation = %.2f', + sd(exampleSample$Height) +) +``` + +```r +## [1] "Sample height: std deviation = 10.07" +``` + +样本平均值和标准差相似,但不完全等于总体值。现在,让我们取 50 个个体的大量样本,计算每个样本的平均值,并查看得出的平均值抽样分布。为了更好地估计抽样分布,我们必须决定要采集多少样本——在这种情况下,让我们采集 5000 个样本,以便我们对答案真正有信心。请注意,像这样的模拟有时需要几分钟才能运行,并且可能会使您的计算机变得气喘吁吁。图[7.1](#fig:samplePlot)中的柱状图显示,对 50 个个体的每个样本估计的平均值有所不同,但总体而言,它们集中在人口平均值周围。 + +```r +# compute sample means across 5000 samples from NHANES data +sampSize <- 50 # size of sample +nsamps <- 5000 # number of samples we will take + +# set up variable to store all of the results +sampMeans <- array(NA, nsamps) + +# Loop through and repeatedly sample and compute the mean +for (i in 1:nsamps) { + NHANES_sample <- sample_n(NHANES_adult, sampSize) + sampMeans[i] <- mean(NHANES_sample$Height) +} + +sprintf( + "Average sample mean = %.2f", + mean(sampMeans) +) +``` + +```r +## [1] "Average sample mean = 168.33" +``` + +```r +sampMeans_df <- tibble(sampMeans = sampMeans) +``` + +![The blue histogram shows the sampling distribution of the mean over 5000 random samples from the NHANES dataset. The histogram for the full dataset is shown in gray for reference.](img/file45.png) + +图 7.1 蓝色柱状图显示了来自 nhanes 数据集的 5000 多个随机样本的平均值的抽样分布。完整数据集的柱状图以灰色显示以供参考。 + +## 7.3 平均值的标准误差 + +在课程的后面,能够描述我们的样本是如何变化的将变得非常重要,以便对样本统计进行推断。对于平均值,我们使用一个称为平均值(sem)的 _ 标准误差 _ 的量来实现这一点,我们可以将其视为采样分布的标准偏差。如果我们知道总体标准偏差,那么我们可以使用以下公式计算标准误差: + +![](img/60a874247e629e795c77019611dc08cd.jpg) + +其中![](img/493731e423d5db62086d0b8705dda0c8.jpg)是样本的大小。我们通常不知道![](img/2469b2bd2a1ab19ebfcee223dcb52bb1.jpg)(总体标准差),因此我们通常会插入我们对![](img/2469b2bd2a1ab19ebfcee223dcb52bb1.jpg)的估计,这是根据样本(![](img/9ed922d2a0d420aba3e34067283b6580.jpg))计算的标准差: + +![](img/ea21ebe8ecb6ffa0c78fdcc2e6b4a037.jpg) + +但是,如果我们的样本很小(少于 30 个),我们必须小心使用估计的标准偏差计算 SEM。 + +因为我们有许多来自 nhanes 总体的样本,并且我们实际上知道总体参数,所以我们可以确认使用总体参数估计的 SEM 非常接近我们从 nhanes 数据集中采集的样本的观测标准偏差。 + +```r +# compare standard error based on population to standard deviation +# of sample means + +sprintf( + 'Estimated standard error based on population SD: %.2f', + sd(NHANES_adult$Height)/sqrt(sampSize) +) +``` + +```r +## [1] "Estimated standard error based on population SD: 1.44" +``` + +```r +sprintf( + 'Standard deviation of sample means = %.2f', + sd(sampMeans) +) +``` + +```r +## [1] "Standard deviation of sample means = 1.43" +``` + +平均值的标准误差公式表明,我们的测量质量涉及两个量:总体变异性和样本大小。当然,因为样本大小是 sem 公式中的分母,当保持总体变异性常数时,较大的样本大小将产生较小的 sem。我们无法控制种群的变异性,但是我们 _ 确实可以控制样本的大小。因此,如果我们希望改进样本统计(通过减少样本变异性),那么我们应该使用更大的样本。然而,这个公式也告诉我们关于统计抽样的一些非常基本的东西——也就是说,较大样本的效用随样本大小的平方根而减小。这意味着双倍的样本量将 _ 而不是 _ 使统计数据的质量加倍;相反,它将把统计数据的质量提高一倍![](img/50ccfaf5af61b99211bf9479875bd1b6.jpg)。在[10.3 节](#statistical-power)中,我们将讨论与此观点密切相关的统计能力。_ + +## 7.4 中心极限定理 + +中心极限定理告诉我们,随着样本大小的增大,即使每个样本中的数据不是正态分布的,平均值的抽样分布也将变为正态分布。 + +我们也可以在真实数据中看到这一点。让我们来研究一下 nhanes 分布中的可变醇年,它是高度倾斜的,如图[7.2](#fig:alcoholYearDist)所示。 + +![Distribution of the variable AlcoholYear in the NHANES dataset, which reflects the number of days that the individual drank in a year.](img/file46.png) + +图 7.2 NHANES 数据集中可变酒精年的分布,反映了个人一年内饮酒的天数。 + +由于缺少更好的单词,这种分布方式很奇怪,而且绝对不是正态分布。现在让我们看看这个变量的平均值的抽样分布。图[7.3](#fig:alcDist50)显示了该变量的采样分布,该分布是通过从 nhanes 数据集中重复抽取大小为 50 的样本并取平均值获得的。尽管原始数据具有明显的非正态性,但采样分布与正态分布非常接近。 + +![The sampling distribution of the mean for AlcoholYear in the NHANES dataset, obtained by drawing repeated samples of size 50, in blue. The normal distribution with the same mean and standard deviation is shown in red.](img/file47.png) + +图 7.3 NHANES 数据集中醇年平均值的抽样分布,通过绘制尺寸为 50 的蓝色重复样本获得。具有相同平均值和标准偏差的正态分布以红色显示。 + +## 7.5 置信区间 + +大多数人都熟悉政治民意调查“误差幅度”的概念。这些民意测验通常试图提供一个准确率在+/-3%以内的答案。例如,当一个候选人被估计以 9 个百分点赢得选举,误差幅度为 3 时,他们将赢得的百分比被估计在 6-12 个百分点之内。在统计学中,我们将这一范围的值称为 _ 置信区间 _,它提供了对我们的估计与总体参数的接近程度的不确定性程度的度量。条件区间越大,我们的不确定性就越大。 + +在上一节中我们看到,有了足够的样本量,平均值的抽样分布是正态分布的,标准误差描述了这个抽样分布的标准偏差。利用这些知识,我们可以问:我们期望在什么范围内获取所有平均值估计值的 95%?为了回答这个问题,我们可以使用正态分布,我们知道我们期望 95%的样本均值在正态分布之间下降。具体来说,我们使用正态分布的 _ 分位数 _ 函数(`qnorm()`in r)来确定正态分布在分布中 2.5%和 97.5%点的值。我们选择这些点是因为我们想要找到分布中心的 95%的值,所以我们需要在每个端部截取 2.5%个,以便最终在中间有 95%个。图[7.4](#fig:normalCutoffs)显示了发生在![](img/e14d827ce77303188aec5520ec9eba30.jpg)上的情况。 + +![Normal distribution, with the orange section in the center denoting the range in which we expect 95 percent of all values to fall. The green sections show the portions of the distribution that are more extreme, which we would expect to occur less than 5 percent of the time.](img/file48.png) + +图 7.4 正态分布,中间橙色部分表示我们预计所有值 95%会下降的范围。绿色部分显示了分布中更极端的部分,我们希望在不到 5%的时间内发生。 + +使用这些截止值,我们可以为平均值的估计创建一个置信区间: + +![](img/79de3061cb2a1bf04b2fd35328b0005a.jpg) + +让我们计算 nhanes 高度数据的置信区间, + +```r +# compute confidence intervals + +NHANES_sample <- sample_n(NHANES_adult,250) + +sample_summary <- NHANES_sample %>% + summarize(mean=mean(Height), + sem=sd(Height)/sqrt(sampSize)) %>% + mutate(CI_lower=mean-1.96*sem, + CI_upper=mean+1.96*sem) +pander(sample_summary) +``` + + +| 意思是 | 扫描电镜 | Ci_ 下 | Ci_ 上部 | +| --- | --- | --- | --- | +| 166.869 年 | 1.446 个 | 164.036 年 | 169.702 个 | + +置信区间是出了名的混乱,主要是因为它们并不代表我们希望它们的含义。很自然地认为,95%的置信区间告诉我们,人口平均值有 95%的概率落在区间内。然而,正如我们将在整个课程中看到的,统计中的概念通常并不意味着我们认为它们应该意味着什么。在置信区间的情况下,我们不能用这种方式解释它们,因为总体参数有一个固定值——要么在区间内,要么不在区间内。95%置信区间的正确解释是,它将捕获 95%时间的真实总体平均值。我们可以通过重复对 nhanes 数据重新采样并计算间隔包含真实总体平均值的频率来确认这一点。 + +```r +# compute how often the confidence interval contains the true population mean +nsamples <- 2500 +sampSize <- 100 + +ci_contains_mean <- array(NA,nsamples) + +for (i in 1:nsamples) { + NHANES_sample <- sample_n(NHANES_adult, sampSize) + sample_summary <- + NHANES_sample %>% + summarize( + mean = mean(Height), + sem = sd(Height) / sqrt(sampSize) + ) %>% + mutate( + CI_upper = mean + 1.96 * sem, + CI_lower = mean - 1.96 * sem + ) + ci_contains_mean[i] <- + (sample_summary$CI_upper > mean(NHANES_adult$Height)) & + (sample_summary$CI_lower < mean(NHANES_adult$Height)) +} + +sprintf( + 'proportion of confidence intervals containing population mean: %.3f', + mean(ci_contains_mean) +) +``` + +```r +## [1] "proportion of confidence intervals containing population mean: 0.953" +``` + +这证实了置信区间确实捕获了 95%左右的人口平均值。 + +## 7.6 阅读建议 + +* 信号和噪音:为什么这么多的预测都失败了——但有些预测却失败了,作者是 Nate Silver。 \ No newline at end of file diff --git a/docs/7.x2.md b/docs/7.x2.md deleted file mode 100644 index 1d55ba92918e3cac9da761712ecb92f2db5b3938..0000000000000000000000000000000000000000 --- a/docs/7.x2.md +++ /dev/null @@ -1,257 +0,0 @@ -# 7 取样 - -统计学的一个基本观点是,我们可以根据一个相对较小的样本对整个人口进行推断。在本章中,我们将介绍统计抽样的概念,并讨论它的工作原理。 - -任何居住在美国的人都将熟悉从政治投票中抽样的概念,这已成为我们选举过程的核心部分。在某些情况下,这些民意测验在预测选举结果方面可能非常准确。最著名的例子来自 2008 年和 2012 年的美国总统选举,当时民意测验专家奈特·西尔弗正确预测了 2008 年 49/50 个州和 2012 年全部 50 个州的选举结果。西尔弗通过结合来自 21 个不同民意调查的数据做到了这一点,这些数据在他们倾向于向共和党或民主党倾斜的程度上各不相同。这些民意调查中的每一项都包含了大约 1000 名可能的选民的数据——这意味着白银几乎能够利用仅有 21000 人的数据以及其他知识(例如,这些州过去的投票方式)完美地预测超过 1.25 亿选民的投票模式。 - -## 7.1 我们如何取样? - -我们的抽样目标是确定感兴趣的全部人群的某些特征,只使用人群的一小部分。我们这样做主要是为了节省时间和精力——为什么要在仅仅一个小样本就足以准确估计兴趣变量的情况下,去测量人口中的每个个体呢? - -在选举的例子中,人口都是选民,样本是由投票组织选出的 1000 人组成的集合。我们选择样本的方式对于确保样本是整个人群的 _ 代表性 _ 至关重要,这是统计抽样的主要目标。很容易想象一个没有代表性的样本;如果一个民意测验者只打电话给那些他们从当地民主党收到名字的人,那么投票结果就不太可能代表整个人口。一般来说,我们将代表性投票定义为每个人口成员都有平等的机会被选中。如果这失败了,那么我们必须担心我们对样本计算的统计数据是否有 _ 偏差 _——也就是说,它的值是否系统地不同于总体值(我们称之为 _ 参数 _)。请记住,我们通常不知道这个人口参数,因为如果我们知道,那么就不需要采样了!但是,我们将使用能够接触到整个人口的例子来解释一些关键的想法。 - -同样重要的是要区分两种不同的取样方式:替换和不替换。在用替换物对 _ 进行采样时,在对某个群体成员进行采样后,将其放回池中,以便再次对其进行采样。在 _ 不替换的采样 _ 中,一旦对某个成员进行了采样,则该成员就没有资格再次进行采样。最常见的是使用不替换的采样,但在某些情况下,我们将使用带替换的采样,例如在[8](#resampling-and-simulation)章中讨论一种称为 _ 引导 _ 的技术。_ - -## 7.2 采样误差 - -不管我们的样本有多具有代表性,我们根据样本计算的统计数据很可能至少与总体参数略有不同。我们称之为 _ 采样误差 _。我们的统计估计值也会因样本而异;我们将我们的统计数据在样本间的分布称为 _ 抽样分布 _。 - -抽样误差直接关系到人口测量的质量。显然,我们希望从样本中获得的估计值尽可能接近总体参数的真实值。然而,即使我们的统计数据是无偏的(也就是说,从长远来看,我们希望它与总体参数具有相同的值),任何特定估计的值都将不同于总体估计,并且当抽样误差较大时,这些差异将更大。因此,减小采样误差是实现更好测量的重要步骤。 - -我们将使用 nhanes 数据集作为示例;我们将假设 nhanes 是整个总体,然后我们将从总体中随机抽取样本。在下一章中,我们将有更多的话要说,关于“随机”样本的生成是如何在计算机中工作的。 - -```r -# load the NHANES data library -library(NHANES) - -# create a NHANES dataset without duplicated IDs -NHANES <- - NHANES %>% - distinct(ID, .keep_all = TRUE) - -#create a dataset of only adults -NHANES_adult <- - NHANES %>% - filter( - !is.na(Height), - Age >= 18 - ) - -#print the NHANES population mean and standard deviation of adult height -sprintf( - "Population height: mean = %.2f", - mean(NHANES_adult$Height) -) -``` - -```r -## [1] "Population height: mean = 168.35" -``` - -```r -sprintf( - "Population height: std deviation = %.2f", - sd(NHANES_adult$Height) -) -``` - -```r -## [1] "Population height: std deviation = 10.16" -``` - -在这个例子中,我们知道成年人口的平均值和身高的标准偏差,因为我们假设 nhanes 数据集包含整个成年人口。现在,让我们从 NHANES 人群中抽取 50 个个体的单个样本,并将结果统计数据与人口参数进行比较。 - -```r -# sample 50 individuals from NHANES dataset -exampleSample <- - NHANES_adult %>% - sample_n(50) - -#print the sample mean and standard deviation of adult height -sprintf( - 'Sample height: mean = %.2f', - mean(exampleSample$Height) - ) -``` - -```r -## [1] "Sample height: mean = 169.46" -``` - -```r -sprintf( - 'Sample height: std deviation = %.2f', - sd(exampleSample$Height) -) -``` - -```r -## [1] "Sample height: std deviation = 10.07" -``` - -样本平均值和标准差相似,但不完全等于总体值。现在,让我们取 50 个个体的大量样本,计算每个样本的平均值,并查看得出的平均值抽样分布。为了更好地估计抽样分布,我们必须决定要采集多少样本——在这种情况下,让我们采集 5000 个样本,以便我们对答案真正有信心。请注意,像这样的模拟有时需要几分钟才能运行,并且可能会使您的计算机变得气喘吁吁。图[7.1](#fig:samplePlot)中的柱状图显示,对 50 个个体的每个样本估计的平均值有所不同,但总体而言,它们集中在人口平均值周围。 - -```r -# compute sample means across 5000 samples from NHANES data -sampSize <- 50 # size of sample -nsamps <- 5000 # number of samples we will take - -# set up variable to store all of the results -sampMeans <- array(NA, nsamps) - -# Loop through and repeatedly sample and compute the mean -for (i in 1:nsamps) { - NHANES_sample <- sample_n(NHANES_adult, sampSize) - sampMeans[i] <- mean(NHANES_sample$Height) -} - -sprintf( - "Average sample mean = %.2f", - mean(sampMeans) -) -``` - -```r -## [1] "Average sample mean = 168.33" -``` - -```r -sampMeans_df <- tibble(sampMeans = sampMeans) -``` - -![The blue histogram shows the sampling distribution of the mean over 5000 random samples from the NHANES dataset. The histogram for the full dataset is shown in gray for reference.](img/file45.png) - -图 7.1 蓝色柱状图显示了来自 nhanes 数据集的 5000 多个随机样本的平均值的抽样分布。完整数据集的柱状图以灰色显示以供参考。 - -## 7.3 平均值的标准误差 - -在课程的后面,能够描述我们的样本是如何变化的将变得非常重要,以便对样本统计进行推断。对于平均值,我们使用一个称为平均值(sem)的 _ 标准误差 _ 的量来实现这一点,我们可以将其视为采样分布的标准偏差。如果我们知道总体标准偏差,那么我们可以使用以下公式计算标准误差: - -![](img/60a874247e629e795c77019611dc08cd.jpg) - -其中![](img/493731e423d5db62086d0b8705dda0c8.jpg)是样本的大小。我们通常不知道![](img/2469b2bd2a1ab19ebfcee223dcb52bb1.jpg)(总体标准差),因此我们通常会插入我们对![](img/2469b2bd2a1ab19ebfcee223dcb52bb1.jpg)的估计,这是根据样本(![](img/9ed922d2a0d420aba3e34067283b6580.jpg))计算的标准差: - -![](img/ea21ebe8ecb6ffa0c78fdcc2e6b4a037.jpg) - -但是,如果我们的样本很小(少于 30 个),我们必须小心使用估计的标准偏差计算 SEM。 - -因为我们有许多来自 nhanes 总体的样本,并且我们实际上知道总体参数,所以我们可以确认使用总体参数估计的 SEM 非常接近我们从 nhanes 数据集中采集的样本的观测标准偏差。 - -```r -# compare standard error based on population to standard deviation -# of sample means - -sprintf( - 'Estimated standard error based on population SD: %.2f', - sd(NHANES_adult$Height)/sqrt(sampSize) -) -``` - -```r -## [1] "Estimated standard error based on population SD: 1.44" -``` - -```r -sprintf( - 'Standard deviation of sample means = %.2f', - sd(sampMeans) -) -``` - -```r -## [1] "Standard deviation of sample means = 1.43" -``` - -平均值的标准误差公式表明,我们的测量质量涉及两个量:总体变异性和样本大小。当然,因为样本大小是 sem 公式中的分母,当保持总体变异性常数时,较大的样本大小将产生较小的 sem。我们无法控制种群的变异性,但是我们 _ 确实可以控制样本的大小。因此,如果我们希望改进样本统计(通过减少样本变异性),那么我们应该使用更大的样本。然而,这个公式也告诉我们关于统计抽样的一些非常基本的东西——也就是说,较大样本的效用随样本大小的平方根而减小。这意味着双倍的样本量将 _ 而不是 _ 使统计数据的质量加倍;相反,它将把统计数据的质量提高一倍![](img/50ccfaf5af61b99211bf9479875bd1b6.jpg)。在[10.3 节](#statistical-power)中,我们将讨论与此观点密切相关的统计能力。_ - -## 7.4 中心极限定理 - -中心极限定理告诉我们,随着样本大小的增大,即使每个样本中的数据不是正态分布的,平均值的抽样分布也将变为正态分布。 - -我们也可以在真实数据中看到这一点。让我们来研究一下 nhanes 分布中的可变醇年,它是高度倾斜的,如图[7.2](#fig:alcoholYearDist)所示。 - -![Distribution of the variable AlcoholYear in the NHANES dataset, which reflects the number of days that the individual drank in a year.](img/file46.png) - -图 7.2 NHANES 数据集中可变酒精年的分布,反映了个人一年内饮酒的天数。 - -由于缺少更好的单词,这种分布方式很奇怪,而且绝对不是正态分布。现在让我们看看这个变量的平均值的抽样分布。图[7.3](#fig:alcDist50)显示了该变量的采样分布,该分布是通过从 nhanes 数据集中重复抽取大小为 50 的样本并取平均值获得的。尽管原始数据具有明显的非正态性,但采样分布与正态分布非常接近。 - -![The sampling distribution of the mean for AlcoholYear in the NHANES dataset, obtained by drawing repeated samples of size 50, in blue. The normal distribution with the same mean and standard deviation is shown in red.](img/file47.png) - -图 7.3 NHANES 数据集中醇年平均值的抽样分布,通过绘制尺寸为 50 的蓝色重复样本获得。具有相同平均值和标准偏差的正态分布以红色显示。 - -## 7.5 置信区间 - -大多数人都熟悉政治民意调查“误差幅度”的概念。这些民意测验通常试图提供一个准确率在+/-3%以内的答案。例如,当一个候选人被估计以 9 个百分点赢得选举,误差幅度为 3 时,他们将赢得的百分比被估计在 6-12 个百分点之内。在统计学中,我们将这一范围的值称为 _ 置信区间 _,它提供了对我们的估计与总体参数的接近程度的不确定性程度的度量。条件区间越大,我们的不确定性就越大。 - -在上一节中我们看到,有了足够的样本量,平均值的抽样分布是正态分布的,标准误差描述了这个抽样分布的标准偏差。利用这些知识,我们可以问:我们期望在什么范围内获取所有平均值估计值的 95%?为了回答这个问题,我们可以使用正态分布,我们知道我们期望 95%的样本均值在正态分布之间下降。具体来说,我们使用正态分布的 _ 分位数 _ 函数(`qnorm()`in r)来确定正态分布在分布中 2.5%和 97.5%点的值。我们选择这些点是因为我们想要找到分布中心的 95%的值,所以我们需要在每个端部截取 2.5%个,以便最终在中间有 95%个。图[7.4](#fig:normalCutoffs)显示了发生在![](img/e14d827ce77303188aec5520ec9eba30.jpg)上的情况。 - -![Normal distribution, with the orange section in the center denoting the range in which we expect 95 percent of all values to fall. The green sections show the portions of the distribution that are more extreme, which we would expect to occur less than 5 percent of the time.](img/file48.png) - -图 7.4 正态分布,中间橙色部分表示我们预计所有值 95%会下降的范围。绿色部分显示了分布中更极端的部分,我们希望在不到 5%的时间内发生。 - -使用这些截止值,我们可以为平均值的估计创建一个置信区间: - -![](img/79de3061cb2a1bf04b2fd35328b0005a.jpg) - -让我们计算 nhanes 高度数据的置信区间, - -```r -# compute confidence intervals - -NHANES_sample <- sample_n(NHANES_adult,250) - -sample_summary <- NHANES_sample %>% - summarize(mean=mean(Height), - sem=sd(Height)/sqrt(sampSize)) %>% - mutate(CI_lower=mean-1.96*sem, - CI_upper=mean+1.96*sem) -pander(sample_summary) -``` - - -| 意思是 | 扫描电镜 | Ci_ 下 | Ci_ 上部 | -| --- | --- | --- | --- | -| 166.869 年 | 1.446 个 | 164.036 年 | 169.702 个 | - -置信区间是出了名的混乱,主要是因为它们并不代表我们希望它们的含义。很自然地认为,95%的置信区间告诉我们,人口平均值有 95%的概率落在区间内。然而,正如我们将在整个课程中看到的,统计中的概念通常并不意味着我们认为它们应该意味着什么。在置信区间的情况下,我们不能用这种方式解释它们,因为总体参数有一个固定值——要么在区间内,要么不在区间内。95%置信区间的正确解释是,它将捕获 95%时间的真实总体平均值。我们可以通过重复对 nhanes 数据重新采样并计算间隔包含真实总体平均值的频率来确认这一点。 - -```r -# compute how often the confidence interval contains the true population mean -nsamples <- 2500 -sampSize <- 100 - -ci_contains_mean <- array(NA,nsamples) - -for (i in 1:nsamples) { - NHANES_sample <- sample_n(NHANES_adult, sampSize) - sample_summary <- - NHANES_sample %>% - summarize( - mean = mean(Height), - sem = sd(Height) / sqrt(sampSize) - ) %>% - mutate( - CI_upper = mean + 1.96 * sem, - CI_lower = mean - 1.96 * sem - ) - ci_contains_mean[i] <- - (sample_summary$CI_upper > mean(NHANES_adult$Height)) & - (sample_summary$CI_lower < mean(NHANES_adult$Height)) -} - -sprintf( - 'proportion of confidence intervals containing population mean: %.3f', - mean(ci_contains_mean) -) -``` - -```r -## [1] "proportion of confidence intervals containing population mean: 0.953" -``` - -这证实了置信区间确实捕获了 95%左右的人口平均值。 - -## 7.6 阅读建议 - -* 信号和噪音:为什么这么多的预测都失败了——但有些预测却失败了,作者是 Nate Silver。 \ No newline at end of file diff --git a/docs/8.md b/docs/8.md index 4f20d77ad8e786b266f98bef8de61f98503f25f2..d64b4c814a73b85cd55927e6bdcc259b0f54e584 100644 --- a/docs/8.md +++ b/docs/8.md @@ -4,4 +4,241 @@ > “在掌握 5 英尺长的分析统计书籍和中等水平的蒙特卡罗模拟统计能力之间,我们可以选择掌握后者。” -在本章中,我们将介绍蒙特卡罗模拟的概念,并讨论如何使用它进行统计分析。 \ No newline at end of file +在本章中,我们将介绍蒙特卡罗模拟的概念,并讨论如何使用它进行统计分析。 + +## 8.1 蒙特卡罗模拟 + +蒙特卡洛模拟的概念是由数学家斯坦·乌兰姆和尼古拉斯·大都会提出的,他们正致力于开发原子武器,作为曼哈顿项目的一部分([https://en.wikipedia.org/wiki/manhattan_project](https://en.wikipedia.org/wiki/Manhattan_Project))。他们需要计算中子与原子核碰撞前在物质中的平均移动距离,但是他们不能用标准数学计算这个距离。乌兰姆意识到这些计算可以用随机数模拟,就像赌场游戏一样。在赌场游戏中,数字是随机抽取的;为了估计特定结果的概率,您可以玩数百次游戏。乌兰姆的叔叔曾在摩纳哥的蒙特卡洛赌场赌博,很明显这项新技术的名字就是从那里来的。 + +执行蒙特卡洛模拟有四个步骤: + +1. 定义可能值的域 +2. 根据概率分布在该域内生成随机数 +3. 使用随机数执行计算 +4. 通过多次重复组合结果 + +作为一个例子,让我们假设我想计算出有多少时间来进行课堂测验。假设我们知道测验完成时间的分布是正常的,平均为 5 分钟,标准差为 1 分钟。考虑到这一点,测试周期需要多长时间才能让我们期望每个人完成 99%的时间?有两种方法可以解决这个问题。第一种方法是使用一种称为极值统计的数学理论来计算答案。然而,这在数学上是相当复杂的。或者,我们可以使用蒙特卡罗模拟。为此,我们需要从正态分布中生成随机样本。 + +## 8.2 统计的随机性 + +“随机”一词通常被通俗地用来指那些奇怪或意想不到的事物,但在统计学中,这个词有一个非常具体的含义:如果一个过程是不可预测的,它就是“随机的”。例如,如果我掷一枚公平硬币 10 次,一次掷硬币的结果值不会提供任何信息,让我预测下一次掷硬币的结果。重要的是要注意的是,有些事情是不可预测的,并不一定意味着它是不确定性的。例如,当我们抛硬币时,抛硬币的结果是由物理定律决定的;如果我们足够详细地知道所有的条件,我们应该能够预测抛硬币的结果。然而,许多因素结合起来,使得硬币翻转的结果在实践中是不可预测的。 + +心理学家已经证明,人类实际上对随机性的认识相当差。首先,当模式不存在时,我们倾向于看到它们。在极端情况下,这导致了 _pareidolia_ 现象,在这种现象中,人们会在随机的模式中感知到熟悉的物体(例如,将云视为人脸或在一片吐司中看到圣母玛利亚)。第二,人类倾向于将随机过程视为自我修正,这导致我们期望在一场游戏中输掉许多回合之后,我们会“赢得一场比赛”,这是一个被称为“赌徒谬论”的现象。 + +## 8.3 生成随机数 + +运行蒙特卡罗模拟需要我们生成随机数。只有通过物理过程才能生成真正的随机数(即完全不可预测的数),例如原子衰变或骰子滚动,这些过程很难获得和/或太慢,无法用于计算机模拟(尽管可以从[NIST 随机信标](https://www.nist.gov/programs-projects/nist-randomness-beacon%5D))。 + +一般来说,我们使用计算机算法生成的 _ 伪随机 _ 数字来代替真正的随机数;从难以预测的意义上讲,这些数字看起来是随机的,但实际上这些数字序列在某一点上会重复出现。例如,R 中使用的随机数生成器将在![](img/e54172313303c2c0ef7164cfc424ae62.jpg)个数之后重复。这远远超过了宇宙历史上的秒数,我们一般认为这对于统计分析的大多数目的来说都是好的。 + +在 R 中,有一个函数可以为每个主要概率分布生成随机数,例如: + +* `runif()`-均匀分布(0 和 1 之间的所有值相等) +* `rnorm()`-正态分布 +* `rbinom()`-二项分布(如掷骰子、掷硬币) + +图[8.1](#fig:rngExamples)显示了使用`runif()`和`rnorm()`函数生成的数字示例,这些函数使用以下代码生成: + +```r +p1 <- + tibble( + x = runif(10000) + ) %>% + ggplot((aes(x))) + + geom_histogram(bins = 100) + + labs(title = "Uniform") + +p2 <- + tibble( + x = rnorm(10000) + ) %>% + ggplot(aes(x)) + + geom_histogram(bins = 100) + + labs(title = "Normal") + +plot_grid(p1, p2, ncol = 3) +``` + +![Examples of random numbers generated from a uniform (left) or normal (right) distribution.](img/file49.png) + +图 8.1 由均匀(左)或正态(右)分布生成的随机数示例。 + +如果您有一个 _ 分位数 _ 函数用于分发,您还可以为任何分发生成随机数。这是累积分布函数的倒数;分位数函数不是确定一组值的累积概率,而是确定一组累积概率的值。使用分位数函数,我们可以从均匀分布中生成随机数,然后通过它的分位数函数将其映射到兴趣分布中。 + +默认情况下,每次运行上面描述的随机数生成器函数之一时,R 都会生成一组不同的随机数。但是,通过将所谓的 _ 随机种子 _ 设置为特定值,也可以生成完全相同的随机数集。我们将在本书中的许多示例中这样做,以确保示例是可重复的。 + +```r +# if we run the rnorm() command twice, it will give us different sets of pseudorandom numbers each time +print(rnorm(n = 5)) +``` + +```r +## [1] 1.48 0.18 0.21 -0.15 -1.72 +``` + +```r +print(rnorm(n = 5)) +``` + +```r +## [1] -0.691 -2.231 0.391 0.029 -0.647 +``` + +```r +# if we set the random seed to the same value each time, then it will give us the same series of pseudorandom numbers each time. +set.seed(12345) +print(rnorm(n = 5)) +``` + +```r +## [1] 0.59 0.71 -0.11 -0.45 0.61 +``` + +```r +set.seed(12345) +print(rnorm(n = 5)) +``` + +```r +## [1] 0.59 0.71 -0.11 -0.45 0.61 +``` + +## 8.4 使用蒙特卡罗模拟 + +让我们回到考试结束时间的例子。假设我管理三个测验,并记录每个学生每次考试的完成时间,这可能类似于图[8.2](#fig:finishingTimes)所示的分布。 + +![Simulated finishing time distributions.](img/file50.png) + +图 8.2 模拟完成时间分布。 + +然而,我们真正想知道的不是完成时间的分布是什么样子的,而是每个测验的 _ 最长 _ 完成时间的分布是什么样子的。为了做到这一点,我们可以模拟大量的测验(假设完成时间是正态分布的,如上所述);对于每个模拟的测验,我们可以记录最长的完成时间。为此,我们在 r 中创建了一个名为`sampleMax()`的新函数,该函数从适当的分布(即正态分布)中模拟适当大小的样本(即班级中的学生数),并返回样本中的最大值。然后,我们使用`replicate()`函数重复此模拟大量次(应该足够 5000 次),该函数将所有输出存储到一个变量中。整理时间分布见图[8.3](#fig:finishTimeSim)。 + +```r +# sample maximum value 5000 times and compute 99th percentile +nRuns <- 5000 +sampSize <- 150 + +sampleMax <- function(sampSize = 150) { + samp <- rnorm(sampSize, mean = 5, sd = 1) + return(max(samp)) +} + +maxTime <- replicate(nRuns, sampleMax()) + +cutoff <- quantile(maxTime, 0.99) +sprintf("99th percentile of maxTime distribution: %.2f", cutoff) +``` + +```r +## [1] "99th percentile of maxTime distribution: 8.81" +``` + +![Distribution of maximum finishing times across simulations.](img/file51.png) + +图 8.3 模拟中最大完成时间的分布。 + +这表明完成时间分布的第 99 个百分点下降到了 8.81,这意味着如果我们为测验留出这么多时间,那么每个人都应该完成 99%的时间。务必记住,我们的假设很重要——如果它们是错误的,那么模拟的结果是无用的。在这种情况下,我们假设完成时间分布为正态分布,具有特定的平均值和标准偏差;如果这些假设不正确(而且几乎可以肯定),那么真正的答案可能会非常不同。 + +## 8.5 使用模拟统计:引导程序 + +到目前为止,我们已经使用模拟来演示统计原理,但是我们也可以使用模拟来回答实际的统计问题。在本节中,我们将介绍一个称为 _ 引导程序 _ 的概念,它允许我们使用模拟来量化统计估计的不确定性。在本课程的后面部分,我们将看到模拟通常如何用于回答统计问题的其他示例,特别是当理论统计方法不可用或假设过于令人窒息时。 + +# + +## 8.5.1 计算引导程序 + +在上面的章节中,我们利用我们对平均值抽样分布的了解来计算平均值和置信区间的标准误差。但是如果我们不能假设这些估计是正态分布的,或者我们不知道它们的分布呢?引导的思想是使用数据本身来估计答案。这个名字来自于用自己的力量把自己拉起来的想法,表达了这样一个想法:我们没有任何外部的杠杆来源,所以我们必须依靠数据本身。自举方法是由斯坦福统计局的布拉德利·埃夫隆构想的,他是世界上最有影响力的统计学家之一。 + +引导背后的想法是,我们从实际的数据集中重复采样;重要的是,我们用替换的对 _ 进行采样,这样同一个数据点通常会在一个样本中被多次表示。然后我们计算每个引导样本的兴趣统计,并使用这些估计的分布。_ + +让我们从使用引导程序来估计平均值的采样分布开始,这样我们就可以将结果与前面讨论的平均值的标准误差(sem)进行比较。 + +```r +# perform the bootstrap to compute SEM and compare to parametric method + +nRuns <- 2500 +sampleSize <- 32 + +heightSample <- + NHANES_adult %>% + sample_n(sampleSize) + +bootMeanHeight <- function(df) { + bootSample <- sample_n(df, dim(df)[1], replace = TRUE) + return(mean(bootSample$Height)) +} + +bootMeans <- replicate(nRuns, bootMeanHeight(heightSample)) + +SEM_standard <- sd(heightSample$Height) / sqrt(sampleSize) +sprintf("SEM computed using sample SD: %f", SEM_standard) +``` + +```r +## [1] "SEM computed using sample SD: 1.595789" +``` + +```r +SEM_bootstrap <- sd(bootMeans) +sprintf("SEM computed using SD of bootstrap estimates: %f", SEM_bootstrap) +``` + +```r +## [1] "SEM computed using SD of bootstrap estimates: 1.586913" +``` + +![An example of bootstrapping to compute the standard error of the mean. The histogram shows the distribution of means across bootstrap samples, while the red line shows the normal distribution based on the sample mean and standard deviation.](img/file52.png) + +图 8.4 计算平均值标准误差的引导示例。柱状图显示平均值在引导样本之间的分布,红线显示基于样本平均值和标准差的正态分布。 + +图[8.4](#fig:bootstrapSEM)显示,基于正态性假设,引导样本的平均值分布与理论估计值相当接近。我们也可以使用引导样本计算平均值的置信区间,只需从引导样本的分布计算感兴趣的分位数。 + +```r +# compute bootstrap confidence interval + +bootCI <- quantile(bootMeans, c(0.025, 0.975)) +pander("bootstrap confidence limits:") +``` + +自举置信限: + +```r +pander(bootCI) +``` + + +| 2.5% | 98% | +| --- | --- | +| 164.634 年 | 170.883 个 | + +```r +# now let's compute the confidence intervals using the sample mean and SD +sampleMean <- mean(heightSample$Height) + +normalCI <- + tibble( + "2.5%" = sampleMean - 1.96 * SEM_standard, + "97.5%" = sampleMean + 1.96 * SEM_standard +) + +print("confidence limits based on sample SD and normal distribution:") +``` + +```r +## [1] "confidence limits based on sample SD and normal distribution:" +``` + +```r +pander(normalCI) +``` + + +| 2.5% | 97.5% | +| --- | --- | +| 164.575 年 | 170.831 个 | + +我们通常不会使用引导程序来计算平均值的置信区间(因为我们通常可以假设正态分布适合平均值的抽样分布,只要我们的样本足够大),但是这个例子显示了该方法如何粗略地给出结果与基于正态分布的标准方法相同。在我们知道或怀疑正态分布不合适的情况下,引导程序更常被用来为其他统计数据的估计生成标准错误。 + +## 8.6 阅读建议 + +* _ 计算机年龄统计推断:算法、证据和数据科学 _,作者:Bradley Efron 和 Trevor Hastie \ No newline at end of file diff --git a/docs/8.x2.md b/docs/8.x2.md deleted file mode 100644 index d64b4c814a73b85cd55927e6bdcc259b0f54e584..0000000000000000000000000000000000000000 --- a/docs/8.x2.md +++ /dev/null @@ -1,244 +0,0 @@ -# 8 重新采样和模拟 - -计算机模拟的使用已经成为现代统计学的一个重要方面。例如,实用计算机科学中最重要的一本书,叫做 _ 数字食谱 _,其内容如下: - -> “在掌握 5 英尺长的分析统计书籍和中等水平的蒙特卡罗模拟统计能力之间,我们可以选择掌握后者。” - -在本章中,我们将介绍蒙特卡罗模拟的概念,并讨论如何使用它进行统计分析。 - -## 8.1 蒙特卡罗模拟 - -蒙特卡洛模拟的概念是由数学家斯坦·乌兰姆和尼古拉斯·大都会提出的,他们正致力于开发原子武器,作为曼哈顿项目的一部分([https://en.wikipedia.org/wiki/manhattan_project](https://en.wikipedia.org/wiki/Manhattan_Project))。他们需要计算中子与原子核碰撞前在物质中的平均移动距离,但是他们不能用标准数学计算这个距离。乌兰姆意识到这些计算可以用随机数模拟,就像赌场游戏一样。在赌场游戏中,数字是随机抽取的;为了估计特定结果的概率,您可以玩数百次游戏。乌兰姆的叔叔曾在摩纳哥的蒙特卡洛赌场赌博,很明显这项新技术的名字就是从那里来的。 - -执行蒙特卡洛模拟有四个步骤: - -1. 定义可能值的域 -2. 根据概率分布在该域内生成随机数 -3. 使用随机数执行计算 -4. 通过多次重复组合结果 - -作为一个例子,让我们假设我想计算出有多少时间来进行课堂测验。假设我们知道测验完成时间的分布是正常的,平均为 5 分钟,标准差为 1 分钟。考虑到这一点,测试周期需要多长时间才能让我们期望每个人完成 99%的时间?有两种方法可以解决这个问题。第一种方法是使用一种称为极值统计的数学理论来计算答案。然而,这在数学上是相当复杂的。或者,我们可以使用蒙特卡罗模拟。为此,我们需要从正态分布中生成随机样本。 - -## 8.2 统计的随机性 - -“随机”一词通常被通俗地用来指那些奇怪或意想不到的事物,但在统计学中,这个词有一个非常具体的含义:如果一个过程是不可预测的,它就是“随机的”。例如,如果我掷一枚公平硬币 10 次,一次掷硬币的结果值不会提供任何信息,让我预测下一次掷硬币的结果。重要的是要注意的是,有些事情是不可预测的,并不一定意味着它是不确定性的。例如,当我们抛硬币时,抛硬币的结果是由物理定律决定的;如果我们足够详细地知道所有的条件,我们应该能够预测抛硬币的结果。然而,许多因素结合起来,使得硬币翻转的结果在实践中是不可预测的。 - -心理学家已经证明,人类实际上对随机性的认识相当差。首先,当模式不存在时,我们倾向于看到它们。在极端情况下,这导致了 _pareidolia_ 现象,在这种现象中,人们会在随机的模式中感知到熟悉的物体(例如,将云视为人脸或在一片吐司中看到圣母玛利亚)。第二,人类倾向于将随机过程视为自我修正,这导致我们期望在一场游戏中输掉许多回合之后,我们会“赢得一场比赛”,这是一个被称为“赌徒谬论”的现象。 - -## 8.3 生成随机数 - -运行蒙特卡罗模拟需要我们生成随机数。只有通过物理过程才能生成真正的随机数(即完全不可预测的数),例如原子衰变或骰子滚动,这些过程很难获得和/或太慢,无法用于计算机模拟(尽管可以从[NIST 随机信标](https://www.nist.gov/programs-projects/nist-randomness-beacon%5D))。 - -一般来说,我们使用计算机算法生成的 _ 伪随机 _ 数字来代替真正的随机数;从难以预测的意义上讲,这些数字看起来是随机的,但实际上这些数字序列在某一点上会重复出现。例如,R 中使用的随机数生成器将在![](img/e54172313303c2c0ef7164cfc424ae62.jpg)个数之后重复。这远远超过了宇宙历史上的秒数,我们一般认为这对于统计分析的大多数目的来说都是好的。 - -在 R 中,有一个函数可以为每个主要概率分布生成随机数,例如: - -* `runif()`-均匀分布(0 和 1 之间的所有值相等) -* `rnorm()`-正态分布 -* `rbinom()`-二项分布(如掷骰子、掷硬币) - -图[8.1](#fig:rngExamples)显示了使用`runif()`和`rnorm()`函数生成的数字示例,这些函数使用以下代码生成: - -```r -p1 <- - tibble( - x = runif(10000) - ) %>% - ggplot((aes(x))) + - geom_histogram(bins = 100) + - labs(title = "Uniform") - -p2 <- - tibble( - x = rnorm(10000) - ) %>% - ggplot(aes(x)) + - geom_histogram(bins = 100) + - labs(title = "Normal") - -plot_grid(p1, p2, ncol = 3) -``` - -![Examples of random numbers generated from a uniform (left) or normal (right) distribution.](img/file49.png) - -图 8.1 由均匀(左)或正态(右)分布生成的随机数示例。 - -如果您有一个 _ 分位数 _ 函数用于分发,您还可以为任何分发生成随机数。这是累积分布函数的倒数;分位数函数不是确定一组值的累积概率,而是确定一组累积概率的值。使用分位数函数,我们可以从均匀分布中生成随机数,然后通过它的分位数函数将其映射到兴趣分布中。 - -默认情况下,每次运行上面描述的随机数生成器函数之一时,R 都会生成一组不同的随机数。但是,通过将所谓的 _ 随机种子 _ 设置为特定值,也可以生成完全相同的随机数集。我们将在本书中的许多示例中这样做,以确保示例是可重复的。 - -```r -# if we run the rnorm() command twice, it will give us different sets of pseudorandom numbers each time -print(rnorm(n = 5)) -``` - -```r -## [1] 1.48 0.18 0.21 -0.15 -1.72 -``` - -```r -print(rnorm(n = 5)) -``` - -```r -## [1] -0.691 -2.231 0.391 0.029 -0.647 -``` - -```r -# if we set the random seed to the same value each time, then it will give us the same series of pseudorandom numbers each time. -set.seed(12345) -print(rnorm(n = 5)) -``` - -```r -## [1] 0.59 0.71 -0.11 -0.45 0.61 -``` - -```r -set.seed(12345) -print(rnorm(n = 5)) -``` - -```r -## [1] 0.59 0.71 -0.11 -0.45 0.61 -``` - -## 8.4 使用蒙特卡罗模拟 - -让我们回到考试结束时间的例子。假设我管理三个测验,并记录每个学生每次考试的完成时间,这可能类似于图[8.2](#fig:finishingTimes)所示的分布。 - -![Simulated finishing time distributions.](img/file50.png) - -图 8.2 模拟完成时间分布。 - -然而,我们真正想知道的不是完成时间的分布是什么样子的,而是每个测验的 _ 最长 _ 完成时间的分布是什么样子的。为了做到这一点,我们可以模拟大量的测验(假设完成时间是正态分布的,如上所述);对于每个模拟的测验,我们可以记录最长的完成时间。为此,我们在 r 中创建了一个名为`sampleMax()`的新函数,该函数从适当的分布(即正态分布)中模拟适当大小的样本(即班级中的学生数),并返回样本中的最大值。然后,我们使用`replicate()`函数重复此模拟大量次(应该足够 5000 次),该函数将所有输出存储到一个变量中。整理时间分布见图[8.3](#fig:finishTimeSim)。 - -```r -# sample maximum value 5000 times and compute 99th percentile -nRuns <- 5000 -sampSize <- 150 - -sampleMax <- function(sampSize = 150) { - samp <- rnorm(sampSize, mean = 5, sd = 1) - return(max(samp)) -} - -maxTime <- replicate(nRuns, sampleMax()) - -cutoff <- quantile(maxTime, 0.99) -sprintf("99th percentile of maxTime distribution: %.2f", cutoff) -``` - -```r -## [1] "99th percentile of maxTime distribution: 8.81" -``` - -![Distribution of maximum finishing times across simulations.](img/file51.png) - -图 8.3 模拟中最大完成时间的分布。 - -这表明完成时间分布的第 99 个百分点下降到了 8.81,这意味着如果我们为测验留出这么多时间,那么每个人都应该完成 99%的时间。务必记住,我们的假设很重要——如果它们是错误的,那么模拟的结果是无用的。在这种情况下,我们假设完成时间分布为正态分布,具有特定的平均值和标准偏差;如果这些假设不正确(而且几乎可以肯定),那么真正的答案可能会非常不同。 - -## 8.5 使用模拟统计:引导程序 - -到目前为止,我们已经使用模拟来演示统计原理,但是我们也可以使用模拟来回答实际的统计问题。在本节中,我们将介绍一个称为 _ 引导程序 _ 的概念,它允许我们使用模拟来量化统计估计的不确定性。在本课程的后面部分,我们将看到模拟通常如何用于回答统计问题的其他示例,特别是当理论统计方法不可用或假设过于令人窒息时。 - -# - -## 8.5.1 计算引导程序 - -在上面的章节中,我们利用我们对平均值抽样分布的了解来计算平均值和置信区间的标准误差。但是如果我们不能假设这些估计是正态分布的,或者我们不知道它们的分布呢?引导的思想是使用数据本身来估计答案。这个名字来自于用自己的力量把自己拉起来的想法,表达了这样一个想法:我们没有任何外部的杠杆来源,所以我们必须依靠数据本身。自举方法是由斯坦福统计局的布拉德利·埃夫隆构想的,他是世界上最有影响力的统计学家之一。 - -引导背后的想法是,我们从实际的数据集中重复采样;重要的是,我们用替换的对 _ 进行采样,这样同一个数据点通常会在一个样本中被多次表示。然后我们计算每个引导样本的兴趣统计,并使用这些估计的分布。_ - -让我们从使用引导程序来估计平均值的采样分布开始,这样我们就可以将结果与前面讨论的平均值的标准误差(sem)进行比较。 - -```r -# perform the bootstrap to compute SEM and compare to parametric method - -nRuns <- 2500 -sampleSize <- 32 - -heightSample <- - NHANES_adult %>% - sample_n(sampleSize) - -bootMeanHeight <- function(df) { - bootSample <- sample_n(df, dim(df)[1], replace = TRUE) - return(mean(bootSample$Height)) -} - -bootMeans <- replicate(nRuns, bootMeanHeight(heightSample)) - -SEM_standard <- sd(heightSample$Height) / sqrt(sampleSize) -sprintf("SEM computed using sample SD: %f", SEM_standard) -``` - -```r -## [1] "SEM computed using sample SD: 1.595789" -``` - -```r -SEM_bootstrap <- sd(bootMeans) -sprintf("SEM computed using SD of bootstrap estimates: %f", SEM_bootstrap) -``` - -```r -## [1] "SEM computed using SD of bootstrap estimates: 1.586913" -``` - -![An example of bootstrapping to compute the standard error of the mean. The histogram shows the distribution of means across bootstrap samples, while the red line shows the normal distribution based on the sample mean and standard deviation.](img/file52.png) - -图 8.4 计算平均值标准误差的引导示例。柱状图显示平均值在引导样本之间的分布,红线显示基于样本平均值和标准差的正态分布。 - -图[8.4](#fig:bootstrapSEM)显示,基于正态性假设,引导样本的平均值分布与理论估计值相当接近。我们也可以使用引导样本计算平均值的置信区间,只需从引导样本的分布计算感兴趣的分位数。 - -```r -# compute bootstrap confidence interval - -bootCI <- quantile(bootMeans, c(0.025, 0.975)) -pander("bootstrap confidence limits:") -``` - -自举置信限: - -```r -pander(bootCI) -``` - - -| 2.5% | 98% | -| --- | --- | -| 164.634 年 | 170.883 个 | - -```r -# now let's compute the confidence intervals using the sample mean and SD -sampleMean <- mean(heightSample$Height) - -normalCI <- - tibble( - "2.5%" = sampleMean - 1.96 * SEM_standard, - "97.5%" = sampleMean + 1.96 * SEM_standard -) - -print("confidence limits based on sample SD and normal distribution:") -``` - -```r -## [1] "confidence limits based on sample SD and normal distribution:" -``` - -```r -pander(normalCI) -``` - - -| 2.5% | 97.5% | -| --- | --- | -| 164.575 年 | 170.831 个 | - -我们通常不会使用引导程序来计算平均值的置信区间(因为我们通常可以假设正态分布适合平均值的抽样分布,只要我们的样本足够大),但是这个例子显示了该方法如何粗略地给出结果与基于正态分布的标准方法相同。在我们知道或怀疑正态分布不合适的情况下,引导程序更常被用来为其他统计数据的估计生成标准错误。 - -## 8.6 阅读建议 - -* _ 计算机年龄统计推断:算法、证据和数据科学 _,作者:Bradley Efron 和 Trevor Hastie \ No newline at end of file diff --git a/docs/9.md b/docs/9.md index 86ac5c8c8c9b1fa18a0ccc8058a1e45a893eb7c5..8bb893ae7125590a4749a4188a18cf8d9e780a97 100644 --- a/docs/9.md +++ b/docs/9.md @@ -6,4 +6,738 @@ * 决定 * 预测 -在这一章中,我们将介绍使用统计学做出决策的背后的想法——特别是关于数据是否支持特定假设的决策。 \ No newline at end of file +在这一章中,我们将介绍使用统计学做出决策的背后的想法——特别是关于数据是否支持特定假设的决策。 + +## 9.1 无效假设统计检验(NHST) + +我们将要讨论的假设检验的具体类型(由于将变得清晰的原因)被称为 _ 无效假设统计检验 _(NHST)。如果你找到了几乎任何科学或生物医学研究出版物,你会看到 NHST 被用来测试假设,在他们的心理学入门教材中,Gerrig&Zimbardo(2002)将 NHST 称为“心理研究的支柱”。因此,学习如何使用和解释假设检验的结果对于理解本研究的结果是至关重要的。 + +然而,你也必须知道,NHST 有着深刻的缺陷,许多统计学家和研究人员(包括我自己)认为这是导致科学严重问题的原因,我们将在[17](#doing-reproducible-research)章中讨论。50 多年来,有人呼吁放弃 NHST,转而采用其他方法(如我们将在以下章节中讨论的方法): + +* “心理研究中统计意义的检验可以被看作是研究过程中一种基本的无意识状态”(Bakan,1966 年)。 +* 假设检验是“对什么构成科学进步的错误看法”(Luce,1988)。 + +NHST 也被广泛误解,主要是因为它违背了我们关于统计假设检验应该如何工作的直觉。让我们来看一个例子。 + +## 9.2 无效假设统计检验:一个例子 + +人们对警员使用随身携带的摄像头非常感兴趣,这些摄像头被认为可以减少使用武力,改善警员的行为。然而,为了证实这一点,我们需要实验证据,政府使用随机对照试验来检验这一观点已经变得越来越普遍。华盛顿特区政府和华盛顿大都会警察局于 2015/2016 年进行了一项随机对照试验,以验证穿体摄像头有效的假设。警察被随机分配是否佩戴有身体的摄像头,然后他们的行为会随着时间的推移被跟踪,以确定摄像头是否会导致更少的使用武力和更少的平民对警察行为的抱怨。 + +在我们得出结果之前,让我们先问一下您认为统计分析可能如何工作。比如说,我们想具体测试一下这样一个假设:照相机的磨损是否会减少对力的使用。随机对照试验为我们提供了数据来检验这一假设,也就是说,分配给摄像机或对照组的军官使用武力的比率。下一个明显的步骤是查看数据并确定它们是否为这个假设提供了令人信服的证据。也就是说:考虑到数据和我们所知道的一切,穿着相机的人减少使用武力的可能性有多大? + +事实证明,这不是无效假设测试的工作原理。相反,我们首先考虑我们感兴趣的假设(即,穿着相机的人是否会减少使用武力),然后将其头部翻转,创建一个 _ 无效假设 _——在这种情况下,无效假设是相机不会减少使用武力。重要的是,我们假设无效假设是正确的。然后,我们查看数据,并确定在我们可以拒绝空值而支持我们感兴趣的假设 _ 替代假设 _ 的空值假设下,数据是否足够不可能。如果没有足够的证据来拒绝空值,那么我们就说我们“未能拒绝”空值。 + +理解 NHST 的一些概念,特别是臭名昭著的“P 值”,总是对第一次遇到它们的人具有挑战性,因为它们是如此的反直觉。正如我们稍后将看到的,还有其他一些方法提供了一种更直观的方法来处理假设测试(但有它们自己的复杂性)。然而,在我们讨论这些问题之前,深入了解假设测试的工作原理是很重要的,因为很明显,它不会很快消失。 + +## 9.3 无效假设检验过程 + +我们可以将无效假设测试的过程分解为若干步骤: + +1. 在看到数据之前,制定一个能够体现我们预测的假设(_)_ +2. 收集一些与假设相关的数据 +3. 指定空假设和可选假设 +4. 将模型与代表替代假设的数据相匹配,并计算检验统计 +5. 假设零假设为真,计算该统计的观测值的概率。 +6. 评估结果的“统计显著性” + +对于实际操作示例,让我们使用 nhanes 数据来问以下问题:体力活动是否与体重指数相关?在 NHANES 数据集中,参与者被问及他们是否经常从事中等强度或高强度的运动、健身或娱乐活动(存储在变量![](img/310d7555288082ab53fff0cef5feda93.jpg)中)。他们还测量了身高和体重,并计算了体重指数: + +![](img/3427c9c9b620e87af7c0487a9a33f36d.jpg) + +# + +## 9.3.1 步骤 1:制定假设 + +对于第 1 步,我们假设不从事体育活动的人的体重指数应该比那些从事体育活动的人大。 + +# + +## 9.3.2 步骤 2:收集一些数据 + +对于步骤 2,我们收集一些数据。在这种情况下,我们将从 nhanes 数据集中抽取 250 个人作为样本。图[9.1](#fig:bmiSample)显示了这样一个样本的例子,其中 bmi 分别为活跃和不活跃的个体显示。 + +```r +# sample 250 adults from NHANES and compute mean BMI separately for active +# and inactive individuals + +sampSize <- 250 + +NHANES_sample <- + NHANES_adult %>% + sample_n(sampSize) + +sampleSummary <- + NHANES_sample %>% + group_by(PhysActive) %>% + summarize( + N = length(BMI), + mean = mean(BMI), + sd = sd(BMI) + ) + +# calculate the mean difference in BMI between active +# and inactive individuals; we'll use this later to calculate the t-statistic +meanDiff <- + sampleSummary %>% + select( + PhysActive, + mean + ) %>% + spread(PhysActive, mean) %>% + mutate( + meanDiff = No - Yes + ) %>% + pull(meanDiff) + +# calculate the summed variances in BMI for active +# and inactive individuals; we'll use this later to calculate the t-statistic +sumVariance <- + sampleSummary %>% + select( + PhysActive, + N, + sd + ) %>% + gather(column, stat, N:sd) %>% + unite(temp, PhysActive, column) %>% + spread(temp, stat) %>% + mutate( + sumVariance = No_sd**2 / No_N + Yes_sd**2 / Yes_N + ) %>% + pull(sumVariance) + +# print sampleSummary table +pander(sampleSummary) +``` + + +| 物理激活 | N 号 | 意思是 | 标准偏差 | +| --- | --- | --- | --- | +| 不 | 135 | 30.25 天 | 第 8.2 条 | +| 是的 | 115 | 28.6 条 | 6.88 条 | + +![Box plot of BMI data from a sample of adults from the NHANES dataset, split by whether they reported engaging in regular physical activity.](img/file53.png) + +图 9.1 NHANES 数据集成人样本中的体重指数数据的框线图,根据他们是否报告参与常规体育活动进行划分。 + +# + +## 9.3.3 步骤 3:指定无效假设和替代假设 + +对于步骤 3,我们需要指定我们的无效假设(我们称之为![](img/696c2566065d128e8f3db12b73065004.jpg))和替代假设(我们称之为![](img/aed725883351a2b6a72135d55f959055.jpg))。![](img/696c2566065d128e8f3db12b73065004.jpg)是用来检验我们的兴趣假设的基线:也就是说,如果没有效果,我们期望数据是什么样子的?无效假设总是涉及到某种等式(=,![](img/f352be7d44a9d17ea095e3b772dc55d7.jpg)或![](img/e304fc62ce46f66f148c82e8a89e3750.jpg))。![](img/aed725883351a2b6a72135d55f959055.jpg)描述了如果实际存在效果,我们所期望的。另一种假设总是涉及某种不等式(![](img/fdc2e14e22ae9a533b2f245e5529fe86.jpg)、>;或<;)。重要的是,无效假设检验是在假设无效假设是真实的前提下进行的,除非证据另有说明。 + +我们还必须决定是使用 _ 定向 _ 还是 _ 非定向 _ 假设。一个非方向性的假设只是预测会有一个差异,而不预测它将朝哪个方向发展。对于 bmi/活动示例,非方向性无效假设为: + +![](img/e766930510f3d9c7fbc0098ef6bee8af.jpg) + +相应的非方向性替代假设是: + +![](img/0e4dd2da7d0eedddb7a3171f5086d33a.jpg) + +另一方面,一个方向性假设预测了差异会朝哪个方向发展。例如,我们有很强的先验知识来预测从事体育活动的人应该比不从事体育活动的人体重轻,因此我们将提出以下定向零假设: + +![](img/67adb4ad7c46655356a6c4c575d44f3e.jpg) + +以及方向选择: + +![](img/78f09615a926a5a0a0d685a8cb9e482e.jpg) + +# + +## 9.3.4 步骤 4:将模型与数据匹配,并计算测试统计 + +对于步骤 4,我们希望使用数据来计算一个统计,最终让我们决定是否拒绝无效假设。为此,模型需要量化有利于替代假设的证据数量,相对于数据的可变性。因此,我们可以将测试统计看作是提供了一种与数据的可变性相比效果大小的度量。一般来说,这个检验统计量会有一个与之相关的概率分布,因为这允许我们确定在无效假设下观察到的统计量值的可能性。 + +对于体重指数的例子,我们需要一个测试统计数据来测试两个平均值之间的差异,因为假设是以每组的平均体重指数来陈述的。一个经常用来比较两种方法的统计数据是 _t-statistic_,首先由统计学家 William Sealy Gossett 开发,他在都柏林的 Guiness Brewery 工作,用笔名“student”书写,因此常被称为“student's t-statistic”。当样本量较小且总体标准差未知时,t 统计量适合比较两组的平均值。两个独立组比较的 t 统计量计算如下: + +![](img/eb22be2bb5310a1a8380ab51dc3403b2.jpg) + +其中![](img/9f07a04e73180057e99b6fb08e88614c.jpg)和![](img/2e54e3c201411d186d4ed11b14e4d6b6.jpg)是两组的平均值,![](img/faae753102a8b7f33f0d7c3b55d0f7fe.jpg)和![](img/81f40c14dd3a65790975635990f05d79.jpg)是两组的估计方差,![](img/43dc0e5b26df34d3e2f9c1ea065d2cec.jpg)和![](img/f654c11a6cebbc4eb0d47572ce0dd9ed.jpg)是两组的大小。t 统计量是根据概率分布(称为 _t_ 分布)分布的。_t_ 分布看起来非常类似于正态分布,但它不同于自由度的数量,在本例中,这是观测次数减去 2,因为我们计算了两个平均值,因此放弃了两个自由度。当自由度较大时(比如 1000),那么 _t_ 分布与正态分布基本相似,但当它们较小时,则 _t_ 分布的尾部比正态长(见图[9.2](#fig:tVersusNormal))。 + +![Each panel shows the t distribution (in blue dashed line) overlaid on the normal distribution (in solid red line). The left panel shows a t distribution with 4 degrees of freedom, in which case the distribution is similar but has slightly wider tails. The right panel shows a t distribution with 1000 degrees of freedom, in which case it is virtually identical to the normal.](img/file54.png) + +图 9.2 各面板显示了覆盖在正态分布(实线红色)上的 t 分布(蓝色虚线)。左侧面板显示 4 个自由度的 t 分布,在这种情况下,分布类似,但尾部稍宽。右面板显示了 1000 自由度的 T 分布,在这种情况下,它实际上与正常值相同。 + +# + +## 9.3.5 步骤 5:确定零假设下数据的概率 + +这是 NHST 开始违背我们的直觉的步骤——而不是在给定数据的情况下确定虚假设为真的可能性,而是在虚假设下确定数据的可能性——因为我们从假设虚假设为真开始!要做到这一点,我们需要知道零假设下统计的概率分布,这样我们就可以问数据在该分布下的可能性有多大。在我们转到我们的 bmi 数据之前,让我们从一些简单的例子开始。 + +### + +## 9.3.5.0.1 随机化:一个非常简单的例子 + +假设我们想确定一枚硬币是否公平。为了收集数据,我们将硬币翻转 100 次,并计算 70 个硬币头。在这个例子中,![](img/59a2a38c03ca704810acd27fd0399c4f.jpg)和![](img/11cc995fd8a686f7d237f267f66f56e0.jpg),我们的测试统计只是我们计算的头的数量。我们接下来要问的问题是:如果头部的真实概率为 0.5,我们观察 70 个头部的可能性有多大。我们可以想象,这可能只是偶然发生,但似乎不太可能。为了量化这个概率,我们可以使用 _ 二项式分布 _: + +![](img/10de921861ff04b451de326942177643.jpg) + +这个方程将告诉我们在给定人头概率的情况下,一定数量人头或更少人头的可能性。然而,我们真正想知道的是某个或多个数字的概率,我们可以从一个数字中减去: + +![](img/7f20013360f315958f63f8a634b9b6a4.jpg) + +我们可以使用 r 中的`pbinom()`函数计算示例的概率,如下所示: + +```r +# compute the probability of 69 or fewer heads, when P(heads)=0.5 +p_lt_70 <- pbinom(69, 100, 0.5) +sprintf("probability of 69 or fewer heads given P(heads)=0.5: %0.6f", p_lt_70) +``` + +```r +## [1] "probability of 69 or fewer heads given P(heads)=0.5: 0.999961" +``` + +```r +# the probability of 70 or more heads is simply the complement of p_lt_70 +p_ge_70 <- 1 - p_lt_70 +sprintf("probability of 70 or more heads given P(heads)=0.5: %0.6f", p_ge_70) +``` + +```r +## [1] "probability of 70 or more heads given P(heads)=0.5: 0.000039" +``` + +这个计算表明,如果硬币真的是公平的话,得到 70 个硬币的可能性是非常小的。现在,如果我们没有`pbinom()`函数来告诉我们头部数量的概率呢?相反,我们可以通过模拟来确定它——我们使用 0.5 的真实概率反复翻转一枚硬币 100 次,然后计算这些模拟运行中头部数量的分布。图[9.3](#fig:coinFlips)显示了该模拟的结果。 + +```r +# simulate tossing of 100,000 flips of 100 coins to identify empirical +# probability of 70 or more heads out of 100 flips + +# create function to toss coins +tossCoins <- function() { + flips <- runif(100) > 0.5 + return(sum(flips)) +} + +# use a large number of replications since this is fast +coinFlips <- replicate(100000, tossCoins()) + +p_ge_70_sim <- mean(coinFlips >= 70) +sprintf( + "empirical probability of 70 or more heads given P(heads)=0.5: %0.6f", + p_ge_70_sim +) +``` + +```r +## [1] "empirical probability of 70 or more heads given P(heads)=0.5: 0.000020" +``` + +![Distribution of numbers of heads (out of 100 flips) across 100,000 simulated runs.](img/file55.png) + +图 9.3 100000 次模拟运行中头数(100 次翻转中)的分布。 + +在这里,我们可以看到通过模拟计算的概率(0.000020)非常接近理论概率(.00004)。 + +让我们为我们的 bmi 示例进行类似的计算。首先,我们使用上面计算的样本值计算 t 统计量: + +```r +tStat <- + meanDiff / sqrt(sumVariance) + +sprintf("t statistic = %0.3f", tStat) +``` + +```r +## [1] "t statistic = 1.735" +``` + +我们接下来要问的问题是:如果两组之间的真正差异为零或更小(即方向性零假设),我们找到这种大小的 t 统计量的可能性有多大? +我们可以使用 t 分布来确定这个概率。我们的样本量是 250,所以适当的 t 分布有 248 个自由度。我们可以使用 r 中的`pt()`函数来确定发现 t 统计量值大于或等于观察值的概率。注意,我们想要知道一个大于我们观察到的值的概率,但是默认情况下`pt()`给我们一个小于我们提供的值的概率,所以我们必须明确告诉它给我们“上尾”概率(通过设置`lower.tail = FALSE`)。 + +```r +pvalue_tdist <- + pt(tStat, df = 248, lower.tail = FALSE) + +sprintf("p(t > %0.2f, df = 248) = %0.3f", tStat, pvalue_tdist) +``` + +```r +## [1] "p(t > 1.74, df = 248) = 0.042" +``` + +这告诉我们,如果虚假设真的是真的,我们观察到的 t 统计量值 1.74 是相对不可能的。 + +在本例中,我们使用了一个方向性假设,因此我们只需要查看零分布的一端。如果我们想测试一个非方向性假设,那么我们就需要能够识别出不管它的方向如何,效果的大小是多么的出乎意料。在 t 检验的上下文中,这意味着我们需要知道统计数据在正方向或负方向上极端的可能性有多大。为此,我们将观察到的 _t_ 值乘以-1,因为 _t_ 分布集中在零附近,然后将两个尾概率相加,得到一个 _ 双尾 _p 值: + +```r +pvalue_tdist_twotailed <- + pt(tStat, df = 248, lower.tail = FALSE) + + pt(-1 * tStat, df = 248, lower.tail = TRUE) + +sprintf( + "p(t > %0.2f or t< %0.2f, df = 248) = %0.3f", + tStat, + -1 * tStat, pvalue_tdist_twotailed +) +``` + +```r +## [1] "p(t > 1.74 or t< -1.74, df = 248) = 0.084" +``` + +在这里我们看到,双尾测试的 p 值是单尾测试的两倍大,这反映了一个事实,即极端值并不令人惊讶,因为它可能发生在两个方向上。 + +如何选择是否使用单尾测试与双尾测试?双尾测试总是比较保守,所以使用它总是一个很好的选择,除非你有一个非常强烈的理由使用单尾测试。在这种情况下,您应该在查看数据之前写下假设。在第[17 章](#doing-reproducible-research)中,我们将讨论假设预登记的概念,它使在您看到实际数据之前写下假设的想法正式化。一旦你看过数据,你就不应该决定如何进行假设检验,因为这会给结果带来严重的偏差。 + +## + +## 9.3.5.1 使用随机化计算 p 值 + +到目前为止,我们已经看到了如何使用 t 分布来计算零假设下数据的概率,但是我们也可以使用模拟来实现这一点。其基本思想是,我们生成模拟数据,就像我们在零假设下所期望的那样,然后询问观察到的数据与模拟数据相比有多极端。关键问题是:我们如何生成零假设为真的数据?一般的答案是,我们可以以一种特定的方式随机地重新排列数据,如果空值是真的,那么数据看起来就像是真的。这类似于引导的想法,从某种意义上说,它使用我们自己的数据来得出一个答案,但它的方式不同。 + +### + +## 9.3.5.1.1 随机化:一个简单的例子 + +让我们从一个简单的例子开始。假设我们想将足球运动员与越野跑运动员的平均蹲起能力与![](img/67a02d6f9c0d63f5ece420476fdbcb9a.jpg)和![](img/7bb8de53c95fdb7c94332e4338c3d0c3.jpg)进行比较。我们测量 5 名足球运动员和 5 名越野跑者的最大蹲坐能力(我们将随机生成,假设![](img/bbdd12086380fc293fd07d0a06fb8ba6.jpg)、![](img/5700012b5b4621d9361ca5b8a4bfffd1.jpg)和![](img/d05cf1311d898025d0c9e6211250948e.jpg)。 + +```r +# generate simulated data for squatting ability across football players +# and cross country runners + +# reset random seed for this example +set.seed(12345678) + +# create a function to round values to nearest product of 5, +# to keep example simple +roundToNearest5 <- function(x, base = 5) { + return(base * round(x / base)) +} + +# create and show data frame containing simulated data +squatDf <- tibble( + group = as.factor(c(rep("FB", 5), rep("XC", 5))), + squat = roundToNearest5(c(rnorm(5) * 30 + 300, rnorm(5) * 30 + 140)) +) + +pander(squatDf) +``` + + +| 组 | 蹲下 | +| --- | --- | +| 联邦调查局 | 335 个 | +| FB | 350 个 | +| FB | 230 | +| FB | 290 个 | +| FB | 325 | +| 徐克 | 115 | +| XC | 115 | +| XC | 170 个 | +| XC | 175 个 | +| XC | 215 个 | + +![Box plots of simulated squatting ability for football players and cross-country runners.](img/file56.png) + +图 9.4 足球运动员和越野跑者的模拟蹲坐能力方框图。 + +从图[9.4](#fig:squatPlot)的图中可以清楚地看出,两组之间存在很大的差异。我们可以使用 r 中的`t.test()`命令进行标准 t 检验来检验我们的假设: + +```r +# compute and print t statistic comparing two groups + +tt <- + t.test( + squat ~ group, + data = squatDf, + alternative = "greater", + var.equal = TRUE + ) + +sprintf("p(t > %0.2f, df = 8) = %0.5f", tt$statistic, tt$p.value) +``` + +```r +## [1] "p(t > 5.14, df = 8) = 0.00044" +``` + +这表明,在零假设下出现这种差异的可能性很小,使用 _t_ 分布来定义零。现在让我们看看如何使用随机化来回答相同的问题。其基本思想是,如果两组之间没有差异的零假设是正确的,那么一组来自哪个组(足球运动员和越野跑者)就不重要了——因此,为了创建与实际数据相似但又符合零假设的数据,我们可以随机地为数据集中的个人排序组标签,然后重新计算组之间的差异。这种洗牌的结果如图[9.5](#fig:scramPlot)所示。 + +```r +# create a scrambled version of the group membership variable + +dfScram <- + squatDf %>% + mutate( + scrambledGroup = sample(group) + ) %>% + select(-group) + +pander(dfScram) +``` + + +| squat | 加扰群 | +| --- | --- | +| 335 | FB | +| 350 | XC | +| 230 | FB | +| 290 | XC | +| 325 | XC | +| 115 | FB | +| 115 | FB | +| 170 | XC | +| 175 | FB | +| 215 | XC | + +![Box plots for subjects assigned to each group after scrambling group labels.](img/file57.png) + +图 9.5 加扰组标签后分配给每组受试者的方框图。 + +在把标签弄乱之后,我们发现这两个组现在更相似了,事实上,跨国组现在的平均值略高。现在让我们做 10000 次,并存储每个迭代的 t 统计信息;这可能需要一些时间来完成。 + +```r +# shuffle data 10,000 times and compute distribution of t values + +nRuns <- 10000 + +shuffleAndMeasure <- function(df) { + dfScram <- + df %>% + mutate( + scrambledGroup = sample(group) + ) + tt <- t.test( + squat ~ scrambledGroup, + data = dfScram, + alternative = "greater", + var.equal = TRUE + ) + return(tt$statistic) +} + +shuffleDiff <- replicate(nRuns, shuffleAndMeasure(squatDf)) + +sprintf("mean t value across shuffles = %0.3f", mean(shuffleDiff)) +``` + +```r +## [1] "mean t value across shuffles = -0.004" +``` + +我们现在可以研究随机分布的数据集中的平均差的分布。图[9.6](#fig:shuffleHist)显示了所有随机随机随机洗牌的组差异的直方图。正如在零假设下所预期的那样,这个分布集中在零。 + +![Histogram of differences between the football and cross-country groups after randomly shuffling group membership. The red line denotes the actual difference observed between the two groups, and the blue line shows the theoretical t distribution for this analysis.](img/file58.png) + +图 9.6 随机改组后足球和越野组之间差异的柱状图。红线表示两组间观察到的实际差异,蓝线表示本次分析的理论 t 分布。 + +我们可以看到,洗牌后 t 值的分布大致遵循零假设下的理论 t 分布(平均值=0),表明随机化产生零数据的效果。如果我们将洗牌后的 t 值与实际的 t 值进行比较,我们还会看到一些有趣的事情: + +```r +# compute number of runs on which t statistic for shuffle data was +# equal to observed t statistic + +equalSum <- sum(shuffleDiff == tt$statistic) +sprintf("Number of runs on which shuffled t == observed t: %d", equalSum) +``` + +```r +## [1] "Number of runs on which shuffled t == observed t: 33" +``` + +```r +# compute number of runs on which t statistic for shuffle data was +# equal to observed t statistic times -1 + +equalSumMinus <- sum(shuffleDiff == tt$statistic * -1) +sprintf("Number of runs on which shuffled t == observed t*-1: %d", equalSumMinus) +``` + +```r +## [1] "Number of runs on which shuffled t == observed t*-1: 28" +``` + +有 33 次随机播放,其中随机播放数据的 t 统计值与观察到的数据完全相同,这意味着随机播放导致了与实际数据相同的标签!这是不可能的,但不是 _ 不可能的,我们可以用概率论来计算它的可能性。10 个项目的可能排列数为![](img/fbdb7bf8c9a265e186d81257fd9cafeb.jpg),结果为 3628800。每组 5 的可能重排数为![](img/5c3dc97ef053d9338662596585bd90f1.jpg),结果为 120,因此两组 5 的可能重排数为![](img/9ac2927615bb00d0f76abd4d11d47373.jpg)或 14400。因此,我们预计 0.0039 的随机标签将与原始标签完全相同,这与我们在模拟中看到的 0.0033 相当接近。我们对标签与真实标签完全相反的次数有着相似的期望,给出了观察到的 t 值的负值。_ + +我们可以通过测量随机数据中有多少随机值至少与观测值一样极端来计算 p 值: + +```r +# compute p value using randomization +pvalRandomization <- mean(shuffleDiff >= tt$statistic) + +sprintf( + 'p(t > %0.2f, df = 8) using randomization = %0.5f', + tt$statistic, + pvalRandomization +) +``` + +```r +## [1] "p(t > 5.14, df = 8) using randomization = 0.00330" +``` + +这个 p 值与我们用 t 分布得到的 p 值非常相似,两者都是非常极端的,这意味着如果零假设为真,观察到的数据就不太可能出现——在这种情况下,我们 _ 知道 _ 不是真的,因为我们生成了 E 数据。 + +### + +## 9.3.5.1.2 随机化:体重指数/活动示例 + +现在让我们使用随机化来计算 bmi/活动示例的 p 值。在这种情况下,我们将随机地对`PhysActive`变量进行随机洗牌,并计算每次洗牌后组之间的差异,然后将观察到的 t 统计量与洗牌数据集中的 t 统计量分布进行比较。 + +```r +# create function to shuffle BMI data + +shuffleBMIstat <- function() { + bmiDataShuffled <- + NHANES_sample %>% + select(BMI, PhysActive) %>% + mutate( + PhysActive = sample(PhysActive) + ) + # compute the difference + simResult <- t.test( + BMI ~ PhysActive, + data = bmiDataShuffled, + var.equal = TRUE + ) + return(simResult$statistic) +} + +# run function 5000 times and save output + +nRuns <- 5000 +meanDiffSimDf <- + data.frame( + meanDiffSim = replicate(nRuns, shuffleBMIstat()) + ) +``` + +让我们看看结果。图[9.7](#fig:simDiff)显示了洗牌样本中 t 值的分布情况,我们还可以计算发现大于或等于观察值的概率: + +```r +# compute the empirical probability of t values larger than observed +# value under the randomization null +bmtTTest <- + t.test( + BMI ~ PhysActive, + data = NHANES_sample, + var.equal = TRUE, + alternative = "greater" +) + +bmiPvalRand <- + mean(meanDiffSimDf$meanDiffSim >= bmtTTest$statistic) + +sprintf( + "p(mean > %0.2f, df = 248) using randomization = %0.5f", + bmtTTest$statistic, + bmiPvalRand +) +``` + +```r +## [1] "p(mean > 1.71, df = 248) using randomization = 0.04380" +``` + +```r +sprintf( + "p(mean > %0.2f, df = 248) using parametric t-test = %0.5f", + bmtTTest$statistic, + bmtTTest$p.value + ) +``` + +```r +## [1] "p(mean > 1.71, df = 248) using parametric t-test = 0.04413" +``` + +![Histogram of t statistics after shuffling of group labels, with the observed value of the t statistic shown in the blue line, and values more extreme than the observed value shown in orange.](img/file59.png) + +图 9.7 组标签洗牌后 t 统计量的柱状图,t 统计量的观测值以蓝线表示,其值比橙色显示的观测值更为极端。 + +同样,随机分组得到的 p 值(0.044)与使用 t 分布得到的 p 值(0.044)非常相似。随机化测试的优点是,它不要求我们假设来自每个组的数据是正态分布的,尽管 T-测试通常对违反该假设的情况非常健壮。此外,随机化检验可以让我们在没有理论分布的情况下计算统计学的 p 值,就像 t 检验一样。 + +我们在使用随机化测试时必须做出一个主要假设,我们称之为 _ 互换性 _。这意味着所有的观测都是以相同的方式分布的,这样我们就可以在不改变总体分布的情况下交换它们。当数据中有相关的观察结果时,这种情况就可以被打破了;例如,如果我们有来自 4 个不同家庭的个人的数据,那么我们就不能假设个人是可交换的,因为兄弟姐妹之间的距离比他们与个人之间的距离更近。来自其他家庭。一般来说,如果数据是通过随机抽样获得的,那么交换性假设应该成立。 + +# + +## 9.3.6 步骤 6:评估结果的“统计显著性” + +下一步是确定从上一步得到的 p 值是否足够小,以至于我们愿意拒绝无效假设,并得出替代方案是真的。我们需要多少证据?这是统计学中最有争议的问题之一,部分原因是它需要主观判断——没有“正确”的答案。 + +历史上,这个问题最常见的答案是,如果 p 值小于 0.05,我们应该拒绝无效假设。这源于罗纳德·费舍尔的著作,他被称为“20 世纪统计学中最重要的人物”(埃夫隆 1998 年): + +> “如果 p 介于.1 和.9 之间,那么肯定没有理由怀疑所测试的假设。如果低于 0.02,则强烈表明该假设不能解释全部事实。如果我们在 0.05 点画一条常规的线,我们就不会经常误入歧途。在我们可以说的水平上划一条线是很方便的:要么治疗中有某种东西,要么发生了一种巧合,比如 20 次试验中不超过一次(Fisher 1925)。 + +然而,费希尔从未打算将![](img/5950d42b56029dacc067b311a4b145d9.jpg)作为一个固定的规则: + +> “没有一个科学工作者有一个固定的意义水平,每年,在任何情况下,他都拒绝假设;他更愿意根据自己的证据和想法来考虑每一个特定的案例”[fish:1956](fish:1956) + +相反,它很可能成为一种仪式,因为在计算之前使用的 p 值表使计算统计数据任意值的 p 值变得容易。所有的表都有一个 0.05 的条目,这使得我们很容易确定一个人的统计数据是否超过了达到这一重要程度所需的值。 + +统计阈值的选择仍然存在很大争议,最近(Benjamin 等人,2018 年)有人提议将标准阈值从 0.05 更改为 0.005,这使得标准阈值更加严格,因此更难拒绝无效假设。在很大程度上,这一举措是由于越来越多的担忧,即从![](img/0dd1a0adf2512b2e2bf82422cf65d45d.jpg)的显著结果中获得的证据相对较弱;我们将在稍后的[17](#doing-reproducible-research)章中对再现性的讨论中更详细地讨论这一点。 + +## + +## 9.3.6.1 假设检验作为决策:Neyman-Pearson 方法 + +尽管费舍尔认为 P 值可以为一个特定的假设提供证据,但是统计学家 Jerzy Neyman 和 Egon Pearson 强烈反对。相反,他们建议我们从长期来看考虑假设检验的错误率: + +> “任何基于概率论的检验本身都不能提供任何有价值的证据来证明假设是真是假。但我们可以从另一个角度来看待测试的目的。在不希望知道每一个独立的假设是正确还是错误的情况下,我们可以寻找规则来管理我们对它们的行为,在这之后,我们保证,从长期经验来看,我们不会经常出错”(J.Neyman 和 Pearson,1933)。 + +也就是说:我们不知道哪些具体的决定是正确的还是错误的,但是如果我们遵守规则,我们至少可以知道我们的决定会有多长时间出错。 + +为了理解 Neyman 和 Pearson 开发的决策框架,我们首先需要根据可能发生的结果种类讨论统计决策。存在两种可能的现实状态(![](img/696c2566065d128e8f3db12b73065004.jpg)为真或![](img/696c2566065d128e8f3db12b73065004.jpg)为假),以及两种可能的决定(拒绝![](img/696c2566065d128e8f3db12b73065004.jpg)或未能拒绝![](img/696c2566065d128e8f3db12b73065004.jpg))。我们可以通过两种方式做出正确的决定: + +* 当![](img/696c2566065d128e8f3db12b73065004.jpg)为假时,我们可以决定拒绝它(在决策理论的语言中,我们称之为 _hit_) +* 当![](img/696c2566065d128e8f3db12b73065004.jpg)为真时,我们无法拒绝它(我们称之为 _ 正确拒绝 _) + +我们还可以犯两种错误: + +* 当![](img/696c2566065d128e8f3db12b73065004.jpg)为真时,我们可以决定拒绝它(我们称之为 _ 假警报 _ 或 _ 类型 I 错误 _) +* 当![](img/696c2566065d128e8f3db12b73065004.jpg)实际为假时,我们无法拒绝它(我们称之为 _Miss_ 或 _Type II Error_) + +Neyman 和 Pearson 创造了两个术语来描述从长远来看这两种错误的可能性: + +* P(I 类错误)=![](img/82005cc2e0087e2a52c7e43df4a19a00.jpg) +* P(II 类错误)=![](img/50705df736e9a7919e768cf8c4e4f794.jpg) + +也就是说,如果我们将![](img/82005cc2e0087e2a52c7e43df4a19a00.jpg)设置为.05,那么从长远来看,我们应该使 I 型错误占 5%。虽然通常将![](img/82005cc2e0087e2a52c7e43df4a19a00.jpg)设置为.05,![](img/50705df736e9a7919e768cf8c4e4f794.jpg)的标准值为.2-也就是说,我们愿意接受 20%的时间检测不到真正的效果。当我们在第[10.3 节](#statistical-power)中讨论统计功率时,我们将回到下面的内容,这是第二类误差的补充。 + +# + +## 9.3.7 重大结果意味着什么? + +关于 p 值的实际含义有很多困惑(Gigerenzer,2004 年)。假设我们做了一个实验,比较条件之间的平均值,我们发现 p 值为 0.01 的差异。有许多可能的解释。 + +## + +## 9.3.7.1 是否意味着零假设为真的概率为 0.01? + +不,请记住,在空假设测试中,p 值是给定空假设(![](img/f3dba6a251b5c95ecee88f2dd3a6752a.jpg))的数据概率。对于给定数据(![](img/f187818f73e98541ec34777c287cc92d.jpg))的无效假设的概率,它不保证得出结论。当我们在后面一章中讨论贝叶斯推理时,我们将回到这个问题上,因为贝叶斯定理让我们以一种可以确定后一种概率的方式反转条件概率。 + +## + +## 9.3.7.2 这是否意味着你做出错误决定的概率是.01? + +不,这是![](img/f187818f73e98541ec34777c287cc92d.jpg),但如上所述,P 值是![](img/696c2566065d128e8f3db12b73065004.jpg)下数据的概率,而不是假设的概率。 + +## + +## 9.3.7.3 这是否意味着如果你再次进行研究,你将获得 99%的相同结果? + +不。p 值是一个关于特定数据集在空值下的可能性的语句;它不允许我们对未来事件(如复制)的可能性进行推断。 + +## + +## 9.3.7.4 这是否意味着你发现了有意义的影响? + +不,统计显著性和实际显著性之间有一个重要区别。举个例子,假设我们进行了一项随机对照试验来检验特定饮食对体重的影响,我们发现在 P<;.05 有统计学意义的影响。这并不能告诉我们实际损失了多少重量,我们称之为 _ 效应大小 _(将在[10](#ci-effect-size-power)章中详细讨论)。如果我们考虑一项关于减肥的研究,那么我们可能不会认为十盎司的减肥(即一袋薯片的重量)实际上是非常重要的。让我们看看我们的能力,检测 1 盎司的显著差异,随着样本量的增加。 + +```r +# create simulated data for weight loss trial + +weightLossTrial <- function(nPerGroup, weightLossOz = 1) { + # mean and SD in Kg based on NHANES adult dataset + kgToOz <- 35.27396195 # conversion constant for Kg to Oz + meanOz <- 81.78 * kgToOz + sdOz <- 21.29 * kgToOz + # create data + controlGroup <- rnorm(nPerGroup) * sdOz + meanOz + expGroup <- rnorm(nPerGroup) * sdOz + meanOz - weightLossOz + ttResult <- t.test(expGroup, controlGroup) + return(c( + nPerGroup, weightLossOz, ttResult$p.value, + diff(ttResult$estimate) + )) +} + +nRuns <- 1000 +sampSizes <- 2**seq(5,17) # powers of 2 + +simResults <- c() ## create an empty list to add results onto +for (i in 1:length(sampSizes)) { + tmpResults <- replicate( + nRuns, + weightLossTrial(sampSizes[i], weightLossOz = 10) + ) + summaryResults <- c( + tmpResults[1, 1], tmpResults[2, 1], + sum(tmpResults[3, ] < 0.05), + mean(tmpResults[4, ]) + ) + simResults <- rbind(simResults, summaryResults) +} + +simResultsDf <- + as.tibble(simResults) %>% + rename( + sampleSize = V1, + effectSizeLbs = V2, + nSigResults = V3, + meanEffect = V4 + ) %>% + mutate(pSigResult = nSigResults / nRuns) +``` + +图[9.8](#fig:sigResults)显示了显著结果的比例如何随着样本量的增加而增加,这样,当样本量非常大(总共约 262000 名受试者)时,当体重减少 1 盎司时,我们将在 90%以上的研究中发现显著结果。尽管这些在统计学上有显著意义,但大多数医生认为一盎司的体重减轻在实际或临床上并不重要。当我们回到[10.3 节](#statistical-power)中的 _ 统计幂 _ 概念时,我们将更详细地探讨这一关系,但从这个例子中应该已经清楚,统计显著性并不一定表示实际意义。 + +![The proportion of signifcant results for a very small change (1 ounce, which is about .001 standard deviations) as a function of sample size.](img/file60.png) + +图 9.8 作为样本量函数的一个非常小的变化(1 盎司,约 0.001 标准偏差)的显著性比例。 + +## 9.4 现代环境下的 NHST:多重测试 + +到目前为止,我们已经讨论了一些例子,其中我们对检验一个单一的统计假设感兴趣,这与传统科学是一致的,后者通常一次只测量几个变量。然而,在现代科学中,我们通常可以测量每个个体数百万个变量。例如,在量化整个基因组的基因研究中,每个个体可能有数百万个测量单位,在大脑成像中,我们常常同时从大脑中超过 100000 个位置收集数据。当标准假设检验应用于这些环境中时,除非我们采取适当的措施,否则会发生不好的事情。 + +让我们看一个例子来看看这是如何工作的。理解能使个人易患诸如精神分裂症等重大精神疾病的遗传因素是很有兴趣的,因为我们知道,在精神分裂症患者中,大约 80%的个体差异是由于遗传差异造成的。人类基因组计划和随后的基因组科学革命为研究人类在基因组上的差异提供了工具。近年来使用的一种方法被称为全基因组关联研究(GWAS),其中每个个体的基因组在其基因组中的 100 万个或更多的位置上进行特征化,以确定他们所拥有的遗传密码的字母(我们称之为“变体”)。在那个地方。在确定了这些之后,研究人员在基因组的每个位置进行了统计测试,以确定被诊断为精神分裂症的人在该位置是否或多或少有一个特定的变异。 + +让我们想象一下,如果研究人员简单地问,在每个地点的 P<;.05 测试是否有意义,而实际上在任何地点都没有真正的效果,会发生什么。为此,我们从一个空分布生成大量的模拟 t 值,并询问其中有多少在 p<;.05 处是重要的。让我们这样做很多次,每次都计算出有多少测试结果是重要的(参见图[9.9](#fig:nullSim))。 + +```r +# simulate 1500 studies with 10,000 tests each, thresholded at p < .05 + +nRuns <- 1500 # number of simulated studies to run +nTests <- 10000 # number of simulated genes to test in each run + +uncAlpha <- 0.05 # alpha level + +uncOutcome <- replicate(nRuns, sum(rnorm(nTests) < qnorm(uncAlpha))) + +sprintf("mean proportion of significant tests per run: %0.2f", mean(uncOutcome) / nTests) +``` + +```r +## [1] "mean proportion of significant tests per run: 0.05" +``` + +```r +# compute proportion of studies with at least one false positive result, +# known as the familywise error rate +sprintf("familywise error rate: %0.3f", mean(uncOutcome > 0)) +``` + +```r +## [1] "familywise error rate: 1.000" +``` + +![A histogram of the number of significant results in each set of 1 million statistical tests, when there is in fact no true effect.](img/file61.png) + +图 9.9:每组 100 万统计试验中,当事实上没有真实效果时,有效结果数量的柱状图。 + +这表明,所有测试中约有 5%在每次运行中都是显著的,这意味着如果我们使用 p<;.05 作为统计显著性的阈值,那么即使没有真正显著的关系存在,我们仍然会“找到”大约 500 个看似显著的基因。NT(预期的重要结果数只是![](img/665dbe1bc3372cde1ad45ed47386bdb6.jpg))。这是因为当我们控制每个测试的错误时,我们没有控制 _ 系列错误 _,或者所有测试中的错误,这是我们真正想要控制的,如果我们要查看大量测试的结果。使用 p<;.05,在上面的例子中,我们的家庭错误率是一个——也就是说,我们几乎可以保证在任何特定的研究中至少出现一个错误。 + +控制家族误差的一个简单方法是将 alpha 水平除以测试次数;这被称为 _bonferroni_ 修正,以意大利统计学家 Carlo Bonferroni 的名字命名。利用上述示例中的数据,我们在图[9.10](#fig:bonferroniSim)中看到,只有约 5%的研究显示使用校正后的α水平 0.000005 而不是名义水平 0.05 的任何显著结果。我们已经有效地控制了家族误差,这样我们研究中的 _ 任何 _ 误差发生的概率控制在 0.05 左右。 + +```r +# compute Bonferroni-corrected alpha +corAlpha <- 0.05 / nTests + +corOutcome <- replicate(nRuns, sum(rnorm(nTests) < (qnorm(corAlpha)))) + +sprintf("corrected familywise error rate: %0.3f", mean(corOutcome > 0)) +``` + +```r +## [1] "corrected familywise error rate: 0.046" +``` + +![A histogram of the number of significant results across all simulation runs after applying the Bonferroni correction for multiple tests.](img/file62.png) + +图 9.10 在多次试验中应用 Bonferroni 校正后,所有模拟运行的重要结果数量的柱状图。 + +## 9.5 阅读建议 + +* [无意识统计,作者:Gerd Gigerenzer](https://library.mpib-berlin.mpg.de/ft/gg/GG_Mindless_2004.pdf) \ No newline at end of file diff --git a/docs/9.x2.md b/docs/9.x2.md deleted file mode 100644 index 8bb893ae7125590a4749a4188a18cf8d9e780a97..0000000000000000000000000000000000000000 --- a/docs/9.x2.md +++ /dev/null @@ -1,743 +0,0 @@ -# 9 假设检验 - -在第一章中,我们讨论了统计的三个主要目标: - -* 描述 -* 决定 -* 预测 - -在这一章中,我们将介绍使用统计学做出决策的背后的想法——特别是关于数据是否支持特定假设的决策。 - -## 9.1 无效假设统计检验(NHST) - -我们将要讨论的假设检验的具体类型(由于将变得清晰的原因)被称为 _ 无效假设统计检验 _(NHST)。如果你找到了几乎任何科学或生物医学研究出版物,你会看到 NHST 被用来测试假设,在他们的心理学入门教材中,Gerrig&Zimbardo(2002)将 NHST 称为“心理研究的支柱”。因此,学习如何使用和解释假设检验的结果对于理解本研究的结果是至关重要的。 - -然而,你也必须知道,NHST 有着深刻的缺陷,许多统计学家和研究人员(包括我自己)认为这是导致科学严重问题的原因,我们将在[17](#doing-reproducible-research)章中讨论。50 多年来,有人呼吁放弃 NHST,转而采用其他方法(如我们将在以下章节中讨论的方法): - -* “心理研究中统计意义的检验可以被看作是研究过程中一种基本的无意识状态”(Bakan,1966 年)。 -* 假设检验是“对什么构成科学进步的错误看法”(Luce,1988)。 - -NHST 也被广泛误解,主要是因为它违背了我们关于统计假设检验应该如何工作的直觉。让我们来看一个例子。 - -## 9.2 无效假设统计检验:一个例子 - -人们对警员使用随身携带的摄像头非常感兴趣,这些摄像头被认为可以减少使用武力,改善警员的行为。然而,为了证实这一点,我们需要实验证据,政府使用随机对照试验来检验这一观点已经变得越来越普遍。华盛顿特区政府和华盛顿大都会警察局于 2015/2016 年进行了一项随机对照试验,以验证穿体摄像头有效的假设。警察被随机分配是否佩戴有身体的摄像头,然后他们的行为会随着时间的推移被跟踪,以确定摄像头是否会导致更少的使用武力和更少的平民对警察行为的抱怨。 - -在我们得出结果之前,让我们先问一下您认为统计分析可能如何工作。比如说,我们想具体测试一下这样一个假设:照相机的磨损是否会减少对力的使用。随机对照试验为我们提供了数据来检验这一假设,也就是说,分配给摄像机或对照组的军官使用武力的比率。下一个明显的步骤是查看数据并确定它们是否为这个假设提供了令人信服的证据。也就是说:考虑到数据和我们所知道的一切,穿着相机的人减少使用武力的可能性有多大? - -事实证明,这不是无效假设测试的工作原理。相反,我们首先考虑我们感兴趣的假设(即,穿着相机的人是否会减少使用武力),然后将其头部翻转,创建一个 _ 无效假设 _——在这种情况下,无效假设是相机不会减少使用武力。重要的是,我们假设无效假设是正确的。然后,我们查看数据,并确定在我们可以拒绝空值而支持我们感兴趣的假设 _ 替代假设 _ 的空值假设下,数据是否足够不可能。如果没有足够的证据来拒绝空值,那么我们就说我们“未能拒绝”空值。 - -理解 NHST 的一些概念,特别是臭名昭著的“P 值”,总是对第一次遇到它们的人具有挑战性,因为它们是如此的反直觉。正如我们稍后将看到的,还有其他一些方法提供了一种更直观的方法来处理假设测试(但有它们自己的复杂性)。然而,在我们讨论这些问题之前,深入了解假设测试的工作原理是很重要的,因为很明显,它不会很快消失。 - -## 9.3 无效假设检验过程 - -我们可以将无效假设测试的过程分解为若干步骤: - -1. 在看到数据之前,制定一个能够体现我们预测的假设(_)_ -2. 收集一些与假设相关的数据 -3. 指定空假设和可选假设 -4. 将模型与代表替代假设的数据相匹配,并计算检验统计 -5. 假设零假设为真,计算该统计的观测值的概率。 -6. 评估结果的“统计显著性” - -对于实际操作示例,让我们使用 nhanes 数据来问以下问题:体力活动是否与体重指数相关?在 NHANES 数据集中,参与者被问及他们是否经常从事中等强度或高强度的运动、健身或娱乐活动(存储在变量![](img/310d7555288082ab53fff0cef5feda93.jpg)中)。他们还测量了身高和体重,并计算了体重指数: - -![](img/3427c9c9b620e87af7c0487a9a33f36d.jpg) - -# - -## 9.3.1 步骤 1:制定假设 - -对于第 1 步,我们假设不从事体育活动的人的体重指数应该比那些从事体育活动的人大。 - -# - -## 9.3.2 步骤 2:收集一些数据 - -对于步骤 2,我们收集一些数据。在这种情况下,我们将从 nhanes 数据集中抽取 250 个人作为样本。图[9.1](#fig:bmiSample)显示了这样一个样本的例子,其中 bmi 分别为活跃和不活跃的个体显示。 - -```r -# sample 250 adults from NHANES and compute mean BMI separately for active -# and inactive individuals - -sampSize <- 250 - -NHANES_sample <- - NHANES_adult %>% - sample_n(sampSize) - -sampleSummary <- - NHANES_sample %>% - group_by(PhysActive) %>% - summarize( - N = length(BMI), - mean = mean(BMI), - sd = sd(BMI) - ) - -# calculate the mean difference in BMI between active -# and inactive individuals; we'll use this later to calculate the t-statistic -meanDiff <- - sampleSummary %>% - select( - PhysActive, - mean - ) %>% - spread(PhysActive, mean) %>% - mutate( - meanDiff = No - Yes - ) %>% - pull(meanDiff) - -# calculate the summed variances in BMI for active -# and inactive individuals; we'll use this later to calculate the t-statistic -sumVariance <- - sampleSummary %>% - select( - PhysActive, - N, - sd - ) %>% - gather(column, stat, N:sd) %>% - unite(temp, PhysActive, column) %>% - spread(temp, stat) %>% - mutate( - sumVariance = No_sd**2 / No_N + Yes_sd**2 / Yes_N - ) %>% - pull(sumVariance) - -# print sampleSummary table -pander(sampleSummary) -``` - - -| 物理激活 | N 号 | 意思是 | 标准偏差 | -| --- | --- | --- | --- | -| 不 | 135 | 30.25 天 | 第 8.2 条 | -| 是的 | 115 | 28.6 条 | 6.88 条 | - -![Box plot of BMI data from a sample of adults from the NHANES dataset, split by whether they reported engaging in regular physical activity.](img/file53.png) - -图 9.1 NHANES 数据集成人样本中的体重指数数据的框线图,根据他们是否报告参与常规体育活动进行划分。 - -# - -## 9.3.3 步骤 3:指定无效假设和替代假设 - -对于步骤 3,我们需要指定我们的无效假设(我们称之为![](img/696c2566065d128e8f3db12b73065004.jpg))和替代假设(我们称之为![](img/aed725883351a2b6a72135d55f959055.jpg))。![](img/696c2566065d128e8f3db12b73065004.jpg)是用来检验我们的兴趣假设的基线:也就是说,如果没有效果,我们期望数据是什么样子的?无效假设总是涉及到某种等式(=,![](img/f352be7d44a9d17ea095e3b772dc55d7.jpg)或![](img/e304fc62ce46f66f148c82e8a89e3750.jpg))。![](img/aed725883351a2b6a72135d55f959055.jpg)描述了如果实际存在效果,我们所期望的。另一种假设总是涉及某种不等式(![](img/fdc2e14e22ae9a533b2f245e5529fe86.jpg)、>;或<;)。重要的是,无效假设检验是在假设无效假设是真实的前提下进行的,除非证据另有说明。 - -我们还必须决定是使用 _ 定向 _ 还是 _ 非定向 _ 假设。一个非方向性的假设只是预测会有一个差异,而不预测它将朝哪个方向发展。对于 bmi/活动示例,非方向性无效假设为: - -![](img/e766930510f3d9c7fbc0098ef6bee8af.jpg) - -相应的非方向性替代假设是: - -![](img/0e4dd2da7d0eedddb7a3171f5086d33a.jpg) - -另一方面,一个方向性假设预测了差异会朝哪个方向发展。例如,我们有很强的先验知识来预测从事体育活动的人应该比不从事体育活动的人体重轻,因此我们将提出以下定向零假设: - -![](img/67adb4ad7c46655356a6c4c575d44f3e.jpg) - -以及方向选择: - -![](img/78f09615a926a5a0a0d685a8cb9e482e.jpg) - -# - -## 9.3.4 步骤 4:将模型与数据匹配,并计算测试统计 - -对于步骤 4,我们希望使用数据来计算一个统计,最终让我们决定是否拒绝无效假设。为此,模型需要量化有利于替代假设的证据数量,相对于数据的可变性。因此,我们可以将测试统计看作是提供了一种与数据的可变性相比效果大小的度量。一般来说,这个检验统计量会有一个与之相关的概率分布,因为这允许我们确定在无效假设下观察到的统计量值的可能性。 - -对于体重指数的例子,我们需要一个测试统计数据来测试两个平均值之间的差异,因为假设是以每组的平均体重指数来陈述的。一个经常用来比较两种方法的统计数据是 _t-statistic_,首先由统计学家 William Sealy Gossett 开发,他在都柏林的 Guiness Brewery 工作,用笔名“student”书写,因此常被称为“student's t-statistic”。当样本量较小且总体标准差未知时,t 统计量适合比较两组的平均值。两个独立组比较的 t 统计量计算如下: - -![](img/eb22be2bb5310a1a8380ab51dc3403b2.jpg) - -其中![](img/9f07a04e73180057e99b6fb08e88614c.jpg)和![](img/2e54e3c201411d186d4ed11b14e4d6b6.jpg)是两组的平均值,![](img/faae753102a8b7f33f0d7c3b55d0f7fe.jpg)和![](img/81f40c14dd3a65790975635990f05d79.jpg)是两组的估计方差,![](img/43dc0e5b26df34d3e2f9c1ea065d2cec.jpg)和![](img/f654c11a6cebbc4eb0d47572ce0dd9ed.jpg)是两组的大小。t 统计量是根据概率分布(称为 _t_ 分布)分布的。_t_ 分布看起来非常类似于正态分布,但它不同于自由度的数量,在本例中,这是观测次数减去 2,因为我们计算了两个平均值,因此放弃了两个自由度。当自由度较大时(比如 1000),那么 _t_ 分布与正态分布基本相似,但当它们较小时,则 _t_ 分布的尾部比正态长(见图[9.2](#fig:tVersusNormal))。 - -![Each panel shows the t distribution (in blue dashed line) overlaid on the normal distribution (in solid red line). The left panel shows a t distribution with 4 degrees of freedom, in which case the distribution is similar but has slightly wider tails. The right panel shows a t distribution with 1000 degrees of freedom, in which case it is virtually identical to the normal.](img/file54.png) - -图 9.2 各面板显示了覆盖在正态分布(实线红色)上的 t 分布(蓝色虚线)。左侧面板显示 4 个自由度的 t 分布,在这种情况下,分布类似,但尾部稍宽。右面板显示了 1000 自由度的 T 分布,在这种情况下,它实际上与正常值相同。 - -# - -## 9.3.5 步骤 5:确定零假设下数据的概率 - -这是 NHST 开始违背我们的直觉的步骤——而不是在给定数据的情况下确定虚假设为真的可能性,而是在虚假设下确定数据的可能性——因为我们从假设虚假设为真开始!要做到这一点,我们需要知道零假设下统计的概率分布,这样我们就可以问数据在该分布下的可能性有多大。在我们转到我们的 bmi 数据之前,让我们从一些简单的例子开始。 - -### - -## 9.3.5.0.1 随机化:一个非常简单的例子 - -假设我们想确定一枚硬币是否公平。为了收集数据,我们将硬币翻转 100 次,并计算 70 个硬币头。在这个例子中,![](img/59a2a38c03ca704810acd27fd0399c4f.jpg)和![](img/11cc995fd8a686f7d237f267f66f56e0.jpg),我们的测试统计只是我们计算的头的数量。我们接下来要问的问题是:如果头部的真实概率为 0.5,我们观察 70 个头部的可能性有多大。我们可以想象,这可能只是偶然发生,但似乎不太可能。为了量化这个概率,我们可以使用 _ 二项式分布 _: - -![](img/10de921861ff04b451de326942177643.jpg) - -这个方程将告诉我们在给定人头概率的情况下,一定数量人头或更少人头的可能性。然而,我们真正想知道的是某个或多个数字的概率,我们可以从一个数字中减去: - -![](img/7f20013360f315958f63f8a634b9b6a4.jpg) - -我们可以使用 r 中的`pbinom()`函数计算示例的概率,如下所示: - -```r -# compute the probability of 69 or fewer heads, when P(heads)=0.5 -p_lt_70 <- pbinom(69, 100, 0.5) -sprintf("probability of 69 or fewer heads given P(heads)=0.5: %0.6f", p_lt_70) -``` - -```r -## [1] "probability of 69 or fewer heads given P(heads)=0.5: 0.999961" -``` - -```r -# the probability of 70 or more heads is simply the complement of p_lt_70 -p_ge_70 <- 1 - p_lt_70 -sprintf("probability of 70 or more heads given P(heads)=0.5: %0.6f", p_ge_70) -``` - -```r -## [1] "probability of 70 or more heads given P(heads)=0.5: 0.000039" -``` - -这个计算表明,如果硬币真的是公平的话,得到 70 个硬币的可能性是非常小的。现在,如果我们没有`pbinom()`函数来告诉我们头部数量的概率呢?相反,我们可以通过模拟来确定它——我们使用 0.5 的真实概率反复翻转一枚硬币 100 次,然后计算这些模拟运行中头部数量的分布。图[9.3](#fig:coinFlips)显示了该模拟的结果。 - -```r -# simulate tossing of 100,000 flips of 100 coins to identify empirical -# probability of 70 or more heads out of 100 flips - -# create function to toss coins -tossCoins <- function() { - flips <- runif(100) > 0.5 - return(sum(flips)) -} - -# use a large number of replications since this is fast -coinFlips <- replicate(100000, tossCoins()) - -p_ge_70_sim <- mean(coinFlips >= 70) -sprintf( - "empirical probability of 70 or more heads given P(heads)=0.5: %0.6f", - p_ge_70_sim -) -``` - -```r -## [1] "empirical probability of 70 or more heads given P(heads)=0.5: 0.000020" -``` - -![Distribution of numbers of heads (out of 100 flips) across 100,000 simulated runs.](img/file55.png) - -图 9.3 100000 次模拟运行中头数(100 次翻转中)的分布。 - -在这里,我们可以看到通过模拟计算的概率(0.000020)非常接近理论概率(.00004)。 - -让我们为我们的 bmi 示例进行类似的计算。首先,我们使用上面计算的样本值计算 t 统计量: - -```r -tStat <- - meanDiff / sqrt(sumVariance) - -sprintf("t statistic = %0.3f", tStat) -``` - -```r -## [1] "t statistic = 1.735" -``` - -我们接下来要问的问题是:如果两组之间的真正差异为零或更小(即方向性零假设),我们找到这种大小的 t 统计量的可能性有多大? -我们可以使用 t 分布来确定这个概率。我们的样本量是 250,所以适当的 t 分布有 248 个自由度。我们可以使用 r 中的`pt()`函数来确定发现 t 统计量值大于或等于观察值的概率。注意,我们想要知道一个大于我们观察到的值的概率,但是默认情况下`pt()`给我们一个小于我们提供的值的概率,所以我们必须明确告诉它给我们“上尾”概率(通过设置`lower.tail = FALSE`)。 - -```r -pvalue_tdist <- - pt(tStat, df = 248, lower.tail = FALSE) - -sprintf("p(t > %0.2f, df = 248) = %0.3f", tStat, pvalue_tdist) -``` - -```r -## [1] "p(t > 1.74, df = 248) = 0.042" -``` - -这告诉我们,如果虚假设真的是真的,我们观察到的 t 统计量值 1.74 是相对不可能的。 - -在本例中,我们使用了一个方向性假设,因此我们只需要查看零分布的一端。如果我们想测试一个非方向性假设,那么我们就需要能够识别出不管它的方向如何,效果的大小是多么的出乎意料。在 t 检验的上下文中,这意味着我们需要知道统计数据在正方向或负方向上极端的可能性有多大。为此,我们将观察到的 _t_ 值乘以-1,因为 _t_ 分布集中在零附近,然后将两个尾概率相加,得到一个 _ 双尾 _p 值: - -```r -pvalue_tdist_twotailed <- - pt(tStat, df = 248, lower.tail = FALSE) + - pt(-1 * tStat, df = 248, lower.tail = TRUE) - -sprintf( - "p(t > %0.2f or t< %0.2f, df = 248) = %0.3f", - tStat, - -1 * tStat, pvalue_tdist_twotailed -) -``` - -```r -## [1] "p(t > 1.74 or t< -1.74, df = 248) = 0.084" -``` - -在这里我们看到,双尾测试的 p 值是单尾测试的两倍大,这反映了一个事实,即极端值并不令人惊讶,因为它可能发生在两个方向上。 - -如何选择是否使用单尾测试与双尾测试?双尾测试总是比较保守,所以使用它总是一个很好的选择,除非你有一个非常强烈的理由使用单尾测试。在这种情况下,您应该在查看数据之前写下假设。在第[17 章](#doing-reproducible-research)中,我们将讨论假设预登记的概念,它使在您看到实际数据之前写下假设的想法正式化。一旦你看过数据,你就不应该决定如何进行假设检验,因为这会给结果带来严重的偏差。 - -## - -## 9.3.5.1 使用随机化计算 p 值 - -到目前为止,我们已经看到了如何使用 t 分布来计算零假设下数据的概率,但是我们也可以使用模拟来实现这一点。其基本思想是,我们生成模拟数据,就像我们在零假设下所期望的那样,然后询问观察到的数据与模拟数据相比有多极端。关键问题是:我们如何生成零假设为真的数据?一般的答案是,我们可以以一种特定的方式随机地重新排列数据,如果空值是真的,那么数据看起来就像是真的。这类似于引导的想法,从某种意义上说,它使用我们自己的数据来得出一个答案,但它的方式不同。 - -### - -## 9.3.5.1.1 随机化:一个简单的例子 - -让我们从一个简单的例子开始。假设我们想将足球运动员与越野跑运动员的平均蹲起能力与![](img/67a02d6f9c0d63f5ece420476fdbcb9a.jpg)和![](img/7bb8de53c95fdb7c94332e4338c3d0c3.jpg)进行比较。我们测量 5 名足球运动员和 5 名越野跑者的最大蹲坐能力(我们将随机生成,假设![](img/bbdd12086380fc293fd07d0a06fb8ba6.jpg)、![](img/5700012b5b4621d9361ca5b8a4bfffd1.jpg)和![](img/d05cf1311d898025d0c9e6211250948e.jpg)。 - -```r -# generate simulated data for squatting ability across football players -# and cross country runners - -# reset random seed for this example -set.seed(12345678) - -# create a function to round values to nearest product of 5, -# to keep example simple -roundToNearest5 <- function(x, base = 5) { - return(base * round(x / base)) -} - -# create and show data frame containing simulated data -squatDf <- tibble( - group = as.factor(c(rep("FB", 5), rep("XC", 5))), - squat = roundToNearest5(c(rnorm(5) * 30 + 300, rnorm(5) * 30 + 140)) -) - -pander(squatDf) -``` - - -| 组 | 蹲下 | -| --- | --- | -| 联邦调查局 | 335 个 | -| FB | 350 个 | -| FB | 230 | -| FB | 290 个 | -| FB | 325 | -| 徐克 | 115 | -| XC | 115 | -| XC | 170 个 | -| XC | 175 个 | -| XC | 215 个 | - -![Box plots of simulated squatting ability for football players and cross-country runners.](img/file56.png) - -图 9.4 足球运动员和越野跑者的模拟蹲坐能力方框图。 - -从图[9.4](#fig:squatPlot)的图中可以清楚地看出,两组之间存在很大的差异。我们可以使用 r 中的`t.test()`命令进行标准 t 检验来检验我们的假设: - -```r -# compute and print t statistic comparing two groups - -tt <- - t.test( - squat ~ group, - data = squatDf, - alternative = "greater", - var.equal = TRUE - ) - -sprintf("p(t > %0.2f, df = 8) = %0.5f", tt$statistic, tt$p.value) -``` - -```r -## [1] "p(t > 5.14, df = 8) = 0.00044" -``` - -这表明,在零假设下出现这种差异的可能性很小,使用 _t_ 分布来定义零。现在让我们看看如何使用随机化来回答相同的问题。其基本思想是,如果两组之间没有差异的零假设是正确的,那么一组来自哪个组(足球运动员和越野跑者)就不重要了——因此,为了创建与实际数据相似但又符合零假设的数据,我们可以随机地为数据集中的个人排序组标签,然后重新计算组之间的差异。这种洗牌的结果如图[9.5](#fig:scramPlot)所示。 - -```r -# create a scrambled version of the group membership variable - -dfScram <- - squatDf %>% - mutate( - scrambledGroup = sample(group) - ) %>% - select(-group) - -pander(dfScram) -``` - - -| squat | 加扰群 | -| --- | --- | -| 335 | FB | -| 350 | XC | -| 230 | FB | -| 290 | XC | -| 325 | XC | -| 115 | FB | -| 115 | FB | -| 170 | XC | -| 175 | FB | -| 215 | XC | - -![Box plots for subjects assigned to each group after scrambling group labels.](img/file57.png) - -图 9.5 加扰组标签后分配给每组受试者的方框图。 - -在把标签弄乱之后,我们发现这两个组现在更相似了,事实上,跨国组现在的平均值略高。现在让我们做 10000 次,并存储每个迭代的 t 统计信息;这可能需要一些时间来完成。 - -```r -# shuffle data 10,000 times and compute distribution of t values - -nRuns <- 10000 - -shuffleAndMeasure <- function(df) { - dfScram <- - df %>% - mutate( - scrambledGroup = sample(group) - ) - tt <- t.test( - squat ~ scrambledGroup, - data = dfScram, - alternative = "greater", - var.equal = TRUE - ) - return(tt$statistic) -} - -shuffleDiff <- replicate(nRuns, shuffleAndMeasure(squatDf)) - -sprintf("mean t value across shuffles = %0.3f", mean(shuffleDiff)) -``` - -```r -## [1] "mean t value across shuffles = -0.004" -``` - -我们现在可以研究随机分布的数据集中的平均差的分布。图[9.6](#fig:shuffleHist)显示了所有随机随机随机洗牌的组差异的直方图。正如在零假设下所预期的那样,这个分布集中在零。 - -![Histogram of differences between the football and cross-country groups after randomly shuffling group membership. The red line denotes the actual difference observed between the two groups, and the blue line shows the theoretical t distribution for this analysis.](img/file58.png) - -图 9.6 随机改组后足球和越野组之间差异的柱状图。红线表示两组间观察到的实际差异,蓝线表示本次分析的理论 t 分布。 - -我们可以看到,洗牌后 t 值的分布大致遵循零假设下的理论 t 分布(平均值=0),表明随机化产生零数据的效果。如果我们将洗牌后的 t 值与实际的 t 值进行比较,我们还会看到一些有趣的事情: - -```r -# compute number of runs on which t statistic for shuffle data was -# equal to observed t statistic - -equalSum <- sum(shuffleDiff == tt$statistic) -sprintf("Number of runs on which shuffled t == observed t: %d", equalSum) -``` - -```r -## [1] "Number of runs on which shuffled t == observed t: 33" -``` - -```r -# compute number of runs on which t statistic for shuffle data was -# equal to observed t statistic times -1 - -equalSumMinus <- sum(shuffleDiff == tt$statistic * -1) -sprintf("Number of runs on which shuffled t == observed t*-1: %d", equalSumMinus) -``` - -```r -## [1] "Number of runs on which shuffled t == observed t*-1: 28" -``` - -有 33 次随机播放,其中随机播放数据的 t 统计值与观察到的数据完全相同,这意味着随机播放导致了与实际数据相同的标签!这是不可能的,但不是 _ 不可能的,我们可以用概率论来计算它的可能性。10 个项目的可能排列数为![](img/fbdb7bf8c9a265e186d81257fd9cafeb.jpg),结果为 3628800。每组 5 的可能重排数为![](img/5c3dc97ef053d9338662596585bd90f1.jpg),结果为 120,因此两组 5 的可能重排数为![](img/9ac2927615bb00d0f76abd4d11d47373.jpg)或 14400。因此,我们预计 0.0039 的随机标签将与原始标签完全相同,这与我们在模拟中看到的 0.0033 相当接近。我们对标签与真实标签完全相反的次数有着相似的期望,给出了观察到的 t 值的负值。_ - -我们可以通过测量随机数据中有多少随机值至少与观测值一样极端来计算 p 值: - -```r -# compute p value using randomization -pvalRandomization <- mean(shuffleDiff >= tt$statistic) - -sprintf( - 'p(t > %0.2f, df = 8) using randomization = %0.5f', - tt$statistic, - pvalRandomization -) -``` - -```r -## [1] "p(t > 5.14, df = 8) using randomization = 0.00330" -``` - -这个 p 值与我们用 t 分布得到的 p 值非常相似,两者都是非常极端的,这意味着如果零假设为真,观察到的数据就不太可能出现——在这种情况下,我们 _ 知道 _ 不是真的,因为我们生成了 E 数据。 - -### - -## 9.3.5.1.2 随机化:体重指数/活动示例 - -现在让我们使用随机化来计算 bmi/活动示例的 p 值。在这种情况下,我们将随机地对`PhysActive`变量进行随机洗牌,并计算每次洗牌后组之间的差异,然后将观察到的 t 统计量与洗牌数据集中的 t 统计量分布进行比较。 - -```r -# create function to shuffle BMI data - -shuffleBMIstat <- function() { - bmiDataShuffled <- - NHANES_sample %>% - select(BMI, PhysActive) %>% - mutate( - PhysActive = sample(PhysActive) - ) - # compute the difference - simResult <- t.test( - BMI ~ PhysActive, - data = bmiDataShuffled, - var.equal = TRUE - ) - return(simResult$statistic) -} - -# run function 5000 times and save output - -nRuns <- 5000 -meanDiffSimDf <- - data.frame( - meanDiffSim = replicate(nRuns, shuffleBMIstat()) - ) -``` - -让我们看看结果。图[9.7](#fig:simDiff)显示了洗牌样本中 t 值的分布情况,我们还可以计算发现大于或等于观察值的概率: - -```r -# compute the empirical probability of t values larger than observed -# value under the randomization null -bmtTTest <- - t.test( - BMI ~ PhysActive, - data = NHANES_sample, - var.equal = TRUE, - alternative = "greater" -) - -bmiPvalRand <- - mean(meanDiffSimDf$meanDiffSim >= bmtTTest$statistic) - -sprintf( - "p(mean > %0.2f, df = 248) using randomization = %0.5f", - bmtTTest$statistic, - bmiPvalRand -) -``` - -```r -## [1] "p(mean > 1.71, df = 248) using randomization = 0.04380" -``` - -```r -sprintf( - "p(mean > %0.2f, df = 248) using parametric t-test = %0.5f", - bmtTTest$statistic, - bmtTTest$p.value - ) -``` - -```r -## [1] "p(mean > 1.71, df = 248) using parametric t-test = 0.04413" -``` - -![Histogram of t statistics after shuffling of group labels, with the observed value of the t statistic shown in the blue line, and values more extreme than the observed value shown in orange.](img/file59.png) - -图 9.7 组标签洗牌后 t 统计量的柱状图,t 统计量的观测值以蓝线表示,其值比橙色显示的观测值更为极端。 - -同样,随机分组得到的 p 值(0.044)与使用 t 分布得到的 p 值(0.044)非常相似。随机化测试的优点是,它不要求我们假设来自每个组的数据是正态分布的,尽管 T-测试通常对违反该假设的情况非常健壮。此外,随机化检验可以让我们在没有理论分布的情况下计算统计学的 p 值,就像 t 检验一样。 - -我们在使用随机化测试时必须做出一个主要假设,我们称之为 _ 互换性 _。这意味着所有的观测都是以相同的方式分布的,这样我们就可以在不改变总体分布的情况下交换它们。当数据中有相关的观察结果时,这种情况就可以被打破了;例如,如果我们有来自 4 个不同家庭的个人的数据,那么我们就不能假设个人是可交换的,因为兄弟姐妹之间的距离比他们与个人之间的距离更近。来自其他家庭。一般来说,如果数据是通过随机抽样获得的,那么交换性假设应该成立。 - -# - -## 9.3.6 步骤 6:评估结果的“统计显著性” - -下一步是确定从上一步得到的 p 值是否足够小,以至于我们愿意拒绝无效假设,并得出替代方案是真的。我们需要多少证据?这是统计学中最有争议的问题之一,部分原因是它需要主观判断——没有“正确”的答案。 - -历史上,这个问题最常见的答案是,如果 p 值小于 0.05,我们应该拒绝无效假设。这源于罗纳德·费舍尔的著作,他被称为“20 世纪统计学中最重要的人物”(埃夫隆 1998 年): - -> “如果 p 介于.1 和.9 之间,那么肯定没有理由怀疑所测试的假设。如果低于 0.02,则强烈表明该假设不能解释全部事实。如果我们在 0.05 点画一条常规的线,我们就不会经常误入歧途。在我们可以说的水平上划一条线是很方便的:要么治疗中有某种东西,要么发生了一种巧合,比如 20 次试验中不超过一次(Fisher 1925)。 - -然而,费希尔从未打算将![](img/5950d42b56029dacc067b311a4b145d9.jpg)作为一个固定的规则: - -> “没有一个科学工作者有一个固定的意义水平,每年,在任何情况下,他都拒绝假设;他更愿意根据自己的证据和想法来考虑每一个特定的案例”[fish:1956](fish:1956) - -相反,它很可能成为一种仪式,因为在计算之前使用的 p 值表使计算统计数据任意值的 p 值变得容易。所有的表都有一个 0.05 的条目,这使得我们很容易确定一个人的统计数据是否超过了达到这一重要程度所需的值。 - -统计阈值的选择仍然存在很大争议,最近(Benjamin 等人,2018 年)有人提议将标准阈值从 0.05 更改为 0.005,这使得标准阈值更加严格,因此更难拒绝无效假设。在很大程度上,这一举措是由于越来越多的担忧,即从![](img/0dd1a0adf2512b2e2bf82422cf65d45d.jpg)的显著结果中获得的证据相对较弱;我们将在稍后的[17](#doing-reproducible-research)章中对再现性的讨论中更详细地讨论这一点。 - -## - -## 9.3.6.1 假设检验作为决策:Neyman-Pearson 方法 - -尽管费舍尔认为 P 值可以为一个特定的假设提供证据,但是统计学家 Jerzy Neyman 和 Egon Pearson 强烈反对。相反,他们建议我们从长期来看考虑假设检验的错误率: - -> “任何基于概率论的检验本身都不能提供任何有价值的证据来证明假设是真是假。但我们可以从另一个角度来看待测试的目的。在不希望知道每一个独立的假设是正确还是错误的情况下,我们可以寻找规则来管理我们对它们的行为,在这之后,我们保证,从长期经验来看,我们不会经常出错”(J.Neyman 和 Pearson,1933)。 - -也就是说:我们不知道哪些具体的决定是正确的还是错误的,但是如果我们遵守规则,我们至少可以知道我们的决定会有多长时间出错。 - -为了理解 Neyman 和 Pearson 开发的决策框架,我们首先需要根据可能发生的结果种类讨论统计决策。存在两种可能的现实状态(![](img/696c2566065d128e8f3db12b73065004.jpg)为真或![](img/696c2566065d128e8f3db12b73065004.jpg)为假),以及两种可能的决定(拒绝![](img/696c2566065d128e8f3db12b73065004.jpg)或未能拒绝![](img/696c2566065d128e8f3db12b73065004.jpg))。我们可以通过两种方式做出正确的决定: - -* 当![](img/696c2566065d128e8f3db12b73065004.jpg)为假时,我们可以决定拒绝它(在决策理论的语言中,我们称之为 _hit_) -* 当![](img/696c2566065d128e8f3db12b73065004.jpg)为真时,我们无法拒绝它(我们称之为 _ 正确拒绝 _) - -我们还可以犯两种错误: - -* 当![](img/696c2566065d128e8f3db12b73065004.jpg)为真时,我们可以决定拒绝它(我们称之为 _ 假警报 _ 或 _ 类型 I 错误 _) -* 当![](img/696c2566065d128e8f3db12b73065004.jpg)实际为假时,我们无法拒绝它(我们称之为 _Miss_ 或 _Type II Error_) - -Neyman 和 Pearson 创造了两个术语来描述从长远来看这两种错误的可能性: - -* P(I 类错误)=![](img/82005cc2e0087e2a52c7e43df4a19a00.jpg) -* P(II 类错误)=![](img/50705df736e9a7919e768cf8c4e4f794.jpg) - -也就是说,如果我们将![](img/82005cc2e0087e2a52c7e43df4a19a00.jpg)设置为.05,那么从长远来看,我们应该使 I 型错误占 5%。虽然通常将![](img/82005cc2e0087e2a52c7e43df4a19a00.jpg)设置为.05,![](img/50705df736e9a7919e768cf8c4e4f794.jpg)的标准值为.2-也就是说,我们愿意接受 20%的时间检测不到真正的效果。当我们在第[10.3 节](#statistical-power)中讨论统计功率时,我们将回到下面的内容,这是第二类误差的补充。 - -# - -## 9.3.7 重大结果意味着什么? - -关于 p 值的实际含义有很多困惑(Gigerenzer,2004 年)。假设我们做了一个实验,比较条件之间的平均值,我们发现 p 值为 0.01 的差异。有许多可能的解释。 - -## - -## 9.3.7.1 是否意味着零假设为真的概率为 0.01? - -不,请记住,在空假设测试中,p 值是给定空假设(![](img/f3dba6a251b5c95ecee88f2dd3a6752a.jpg))的数据概率。对于给定数据(![](img/f187818f73e98541ec34777c287cc92d.jpg))的无效假设的概率,它不保证得出结论。当我们在后面一章中讨论贝叶斯推理时,我们将回到这个问题上,因为贝叶斯定理让我们以一种可以确定后一种概率的方式反转条件概率。 - -## - -## 9.3.7.2 这是否意味着你做出错误决定的概率是.01? - -不,这是![](img/f187818f73e98541ec34777c287cc92d.jpg),但如上所述,P 值是![](img/696c2566065d128e8f3db12b73065004.jpg)下数据的概率,而不是假设的概率。 - -## - -## 9.3.7.3 这是否意味着如果你再次进行研究,你将获得 99%的相同结果? - -不。p 值是一个关于特定数据集在空值下的可能性的语句;它不允许我们对未来事件(如复制)的可能性进行推断。 - -## - -## 9.3.7.4 这是否意味着你发现了有意义的影响? - -不,统计显著性和实际显著性之间有一个重要区别。举个例子,假设我们进行了一项随机对照试验来检验特定饮食对体重的影响,我们发现在 P<;.05 有统计学意义的影响。这并不能告诉我们实际损失了多少重量,我们称之为 _ 效应大小 _(将在[10](#ci-effect-size-power)章中详细讨论)。如果我们考虑一项关于减肥的研究,那么我们可能不会认为十盎司的减肥(即一袋薯片的重量)实际上是非常重要的。让我们看看我们的能力,检测 1 盎司的显著差异,随着样本量的增加。 - -```r -# create simulated data for weight loss trial - -weightLossTrial <- function(nPerGroup, weightLossOz = 1) { - # mean and SD in Kg based on NHANES adult dataset - kgToOz <- 35.27396195 # conversion constant for Kg to Oz - meanOz <- 81.78 * kgToOz - sdOz <- 21.29 * kgToOz - # create data - controlGroup <- rnorm(nPerGroup) * sdOz + meanOz - expGroup <- rnorm(nPerGroup) * sdOz + meanOz - weightLossOz - ttResult <- t.test(expGroup, controlGroup) - return(c( - nPerGroup, weightLossOz, ttResult$p.value, - diff(ttResult$estimate) - )) -} - -nRuns <- 1000 -sampSizes <- 2**seq(5,17) # powers of 2 - -simResults <- c() ## create an empty list to add results onto -for (i in 1:length(sampSizes)) { - tmpResults <- replicate( - nRuns, - weightLossTrial(sampSizes[i], weightLossOz = 10) - ) - summaryResults <- c( - tmpResults[1, 1], tmpResults[2, 1], - sum(tmpResults[3, ] < 0.05), - mean(tmpResults[4, ]) - ) - simResults <- rbind(simResults, summaryResults) -} - -simResultsDf <- - as.tibble(simResults) %>% - rename( - sampleSize = V1, - effectSizeLbs = V2, - nSigResults = V3, - meanEffect = V4 - ) %>% - mutate(pSigResult = nSigResults / nRuns) -``` - -图[9.8](#fig:sigResults)显示了显著结果的比例如何随着样本量的增加而增加,这样,当样本量非常大(总共约 262000 名受试者)时,当体重减少 1 盎司时,我们将在 90%以上的研究中发现显著结果。尽管这些在统计学上有显著意义,但大多数医生认为一盎司的体重减轻在实际或临床上并不重要。当我们回到[10.3 节](#statistical-power)中的 _ 统计幂 _ 概念时,我们将更详细地探讨这一关系,但从这个例子中应该已经清楚,统计显著性并不一定表示实际意义。 - -![The proportion of signifcant results for a very small change (1 ounce, which is about .001 standard deviations) as a function of sample size.](img/file60.png) - -图 9.8 作为样本量函数的一个非常小的变化(1 盎司,约 0.001 标准偏差)的显著性比例。 - -## 9.4 现代环境下的 NHST:多重测试 - -到目前为止,我们已经讨论了一些例子,其中我们对检验一个单一的统计假设感兴趣,这与传统科学是一致的,后者通常一次只测量几个变量。然而,在现代科学中,我们通常可以测量每个个体数百万个变量。例如,在量化整个基因组的基因研究中,每个个体可能有数百万个测量单位,在大脑成像中,我们常常同时从大脑中超过 100000 个位置收集数据。当标准假设检验应用于这些环境中时,除非我们采取适当的措施,否则会发生不好的事情。 - -让我们看一个例子来看看这是如何工作的。理解能使个人易患诸如精神分裂症等重大精神疾病的遗传因素是很有兴趣的,因为我们知道,在精神分裂症患者中,大约 80%的个体差异是由于遗传差异造成的。人类基因组计划和随后的基因组科学革命为研究人类在基因组上的差异提供了工具。近年来使用的一种方法被称为全基因组关联研究(GWAS),其中每个个体的基因组在其基因组中的 100 万个或更多的位置上进行特征化,以确定他们所拥有的遗传密码的字母(我们称之为“变体”)。在那个地方。在确定了这些之后,研究人员在基因组的每个位置进行了统计测试,以确定被诊断为精神分裂症的人在该位置是否或多或少有一个特定的变异。 - -让我们想象一下,如果研究人员简单地问,在每个地点的 P<;.05 测试是否有意义,而实际上在任何地点都没有真正的效果,会发生什么。为此,我们从一个空分布生成大量的模拟 t 值,并询问其中有多少在 p<;.05 处是重要的。让我们这样做很多次,每次都计算出有多少测试结果是重要的(参见图[9.9](#fig:nullSim))。 - -```r -# simulate 1500 studies with 10,000 tests each, thresholded at p < .05 - -nRuns <- 1500 # number of simulated studies to run -nTests <- 10000 # number of simulated genes to test in each run - -uncAlpha <- 0.05 # alpha level - -uncOutcome <- replicate(nRuns, sum(rnorm(nTests) < qnorm(uncAlpha))) - -sprintf("mean proportion of significant tests per run: %0.2f", mean(uncOutcome) / nTests) -``` - -```r -## [1] "mean proportion of significant tests per run: 0.05" -``` - -```r -# compute proportion of studies with at least one false positive result, -# known as the familywise error rate -sprintf("familywise error rate: %0.3f", mean(uncOutcome > 0)) -``` - -```r -## [1] "familywise error rate: 1.000" -``` - -![A histogram of the number of significant results in each set of 1 million statistical tests, when there is in fact no true effect.](img/file61.png) - -图 9.9:每组 100 万统计试验中,当事实上没有真实效果时,有效结果数量的柱状图。 - -这表明,所有测试中约有 5%在每次运行中都是显著的,这意味着如果我们使用 p<;.05 作为统计显著性的阈值,那么即使没有真正显著的关系存在,我们仍然会“找到”大约 500 个看似显著的基因。NT(预期的重要结果数只是![](img/665dbe1bc3372cde1ad45ed47386bdb6.jpg))。这是因为当我们控制每个测试的错误时,我们没有控制 _ 系列错误 _,或者所有测试中的错误,这是我们真正想要控制的,如果我们要查看大量测试的结果。使用 p<;.05,在上面的例子中,我们的家庭错误率是一个——也就是说,我们几乎可以保证在任何特定的研究中至少出现一个错误。 - -控制家族误差的一个简单方法是将 alpha 水平除以测试次数;这被称为 _bonferroni_ 修正,以意大利统计学家 Carlo Bonferroni 的名字命名。利用上述示例中的数据,我们在图[9.10](#fig:bonferroniSim)中看到,只有约 5%的研究显示使用校正后的α水平 0.000005 而不是名义水平 0.05 的任何显著结果。我们已经有效地控制了家族误差,这样我们研究中的 _ 任何 _ 误差发生的概率控制在 0.05 左右。 - -```r -# compute Bonferroni-corrected alpha -corAlpha <- 0.05 / nTests - -corOutcome <- replicate(nRuns, sum(rnorm(nTests) < (qnorm(corAlpha)))) - -sprintf("corrected familywise error rate: %0.3f", mean(corOutcome > 0)) -``` - -```r -## [1] "corrected familywise error rate: 0.046" -``` - -![A histogram of the number of significant results across all simulation runs after applying the Bonferroni correction for multiple tests.](img/file62.png) - -图 9.10 在多次试验中应用 Bonferroni 校正后,所有模拟运行的重要结果数量的柱状图。 - -## 9.5 阅读建议 - -* [无意识统计,作者:Gerd Gigerenzer](https://library.mpib-berlin.mpg.de/ft/gg/GG_Mindless_2004.pdf) \ No newline at end of file