Preface
Published:
“问题之所以得到解决,并不是因为获得了新的信息,而是因为我们将那些早已知晓之事重新加以安排。”
—— 路德维希·维特根斯坦,《哲学研究》
我们的世界是复杂的,这几乎是一个再平常不过的观察。科学研究也不例外;在大多数研究领域中,我们往往都会面对看似难以逾越的大量既有研究。不同研究所提供的证据可能彼此冲突,而来自各种信息来源的结论也常常难以整合和理解。
因此,证据综合方法在许多学科中都发挥着关键作用,例如社会科学、医学、生物学以及计量经济学。Meta 分析作为一种将多项研究或多次分析结果加以合并的统计程序,已经成为众多研究领域中不可或缺的工具。尤其是在它能够为实践决策或未来研究方向提供依据时,Meta 分析的重要性更是不可估量。
因此,许多应用研究者都会在自己的“统计工具箱”中掌握一些 Meta 分析技能;还有一些人则希望学习如何在自己的研究领域中开展 Meta 分析。Meta 分析如今已经普及到这样的程度:许多本科生和研究生都已在课程中学习如何实施 Meta 分析——当然,他们的学习热情有时也不尽相同。
和统计计算整体的发展一样,Meta 分析的实施方式在过去几十年中经历了重大转变。这在很大程度上与开源、协作式统计软件的兴起有关,其中最主要的代表就是 R 统计编程语言与环境。R 生态系统使世界各地的研究者和统计学家都能够构建自己的软件包,并免费提供给所有人使用。
这带来了 R 语言中现成统计软件的迅猛增长。在我们写作本书之时,CRAN Task View 中仅专门用于 Meta 分析的软件包就已列出 130 多个。
在 R 中,你几乎什么都能做——字面意义上的“什么都能做”。它是一门完整的编程语言,因此如果你找不到某个功能来完成自己想做的事,你完全可以自己编写。但就 Meta 分析而言,如今几乎已经没有这个必要了。仅仅一小部分 R 包,就已经提供了当前“最前沿”Meta 分析程序中几乎所有的功能——而且是免费的。更进一步地说,还有许多新型的 Meta 分析方法,目前实际上只能在 R 中实现。
简而言之:R 环境为研究者开展 Meta 分析提供了更多工具。在最理想的情况下,这能够帮助我们从数据中得出更稳健的结论,并据此更好地支持决策。
这也引出了一个问题:为什么并不是每个人都在用 R 做 Meta 分析?我们认为主要有两个原因:便利性,以及焦虑感(有时二者兼而有之)。这两点都完全可以理解。大多数 Meta 分析研究者都是应用研究者,而不是统计学家或程序员。学习一门看起来晦涩而复杂的编程语言,这种念头本身就足以让人望而却步。
Meta 分析方法本身也是如此:它有特殊的理论背景、繁多的分析选择,以及多种需要被正确解释的统计量。
通过这本指南,我们希望说明,这些担忧中有许多其实并无必要;而且,学习如何在 R 中开展 Meta 分析,是值得投入精力的。我们希望本指南能帮助你掌握在 R 中完成自己 Meta 分析项目所需的技能。我们也希望这本指南不仅能帮助你理解在什么情况下应使用哪些 Meta 分析方法,还能帮助你理解我们为什么要这样做。
最后但同样重要的是,我们也把这本指南视为一种尝试:向你展示,Meta 分析方法和 R 编程并不只是令人头疼的麻烦事,而是一个值得深入探索、充满魅力的主题。
本书写给普通人
本指南并不是为 Meta 分析专家或统计学家而写。我们并不假定你事先具备任何关于 Meta 分析方法的特殊背景知识。你只需要掌握一些基本的数学和统计学概念即可。例如,我们假设你至少听说过“均值”“标准差”“相关”“回归”“(p)-值”或“正态分布”这些概念。如果这些术语你多少有点印象,那你就完全可以继续读下去。
如果你真的是从零开始,你也许会想先看看 Robert Stinerock 的统计学入门指南(Stinerock 2018),它提供了相当系统的介绍以及在 R 中的动手示例;当然,你也可以选择任何一本你喜欢的统计学入门教材。
虽然我们尽可能将数学内容控制到最低,但在某些地方我们仍会使用数学公式和统计记号。不过,不必惊慌。公式和希腊字母乍看之下可能会令人困惑,但它们常常是精确描述某些 Meta 分析方法背后思想的极佳方式。见过这些公式,并了解它们所代表的含义,也会帮助你在未来阅读更高级的文献时更加从容。
当然,我们也尽最大努力,始终详细解释某些符号或字母具体代表什么,以及某个公式到底想表达什么。在本书附录 C 中,你可以找到我们所使用符号及其含义的列表。在后续章节中,尤其是“高级方法”部分,为了说明某些应用技术背后的思想,我们确实需要稍微更技术性一些。
尽管如此,我们仍确保在这些部分中始终提供一定的数学和统计背景说明。
你也不需要事先掌握 R(甚至一般编程)的知识。在本指南中,我们会尽量平缓地介绍你编写自己的 Meta 分析代码所需的基础 R 技能。我们也会提供进一步学习所需的合适资源。此外,我们还会告诉你如何安装一个免费的计算机程序,以便你能够在 PC 或 Mac 上更加方便地使用 R。
正如书名所示,本书关注的是 Meta 分析中“做”的部分。我们的目标是把这本指南写成一份易于接近的资源,以满足应用研究者、学生和数据科学家使用 R 开展分析的需求。不过,Meta 分析本身是一个庞大而多面的主题,因此不可能在本指南中涵盖一切。对本书而言,这些局限主要体现在以下三个方面:
尽管我们会对这些主题作简要介绍,但我们不会详细讨论如何界定研究问题、如何系统检索并纳入 Meta 分析所需研究,以及如何评估这些研究的质量。这些主题中的每一个都足以单独写成一本书;幸运的是,目前已经有许多有帮助的资源可供参考。
因此,我们只会概述在为 Meta 分析收集数据时需要注意的重要考虑因素和常见陷阱,并为你指向更适合处理这些细节问题的资源。
本指南的第二个局限与其技术深度有关。这本书明确是写给“普通人”的。我们的目标是向你展示何时、如何以及为什么要使用某些 Meta 分析技术,同时也会说明它们的局限与陷阱。我们还会尽量用容易理解、概念性的方式来解释这些技术;只有在确有助于这一目标时,才会进入更技术性的细节。
这也意味着,本指南中的某些部分不会深入到专家级 Meta 分析研究者和统计学家可能期望看到的技术细枝末节。不过,对于有兴趣深入阅读的读者,我们在每一章中都提供了更高级资源和文献的参考。
一本书的内容在某种程度上总会反映作者的背景与经验。我们相信,这里涵盖的方法适用于广泛的研究领域与学科,也具有广泛相关性。不过,我们仍希望说明:本书四位作者主要熟悉的是心理学、精神病学、医学以及干预研究等领域中的当前研究。
因此,本书中的“真实世界”案例和示例,主要集中在我们相对熟悉的主题上。好消息是,只要满足某些前提条件(这些我们会在书中讨论),Meta 分析方法在很大程度上并不依赖数据来自哪个研究领域,并且可以用于多种类型的结局指标。
尽管如此,尽管我们已尽最大努力让本指南尽可能适用于尽可能多的应用研究学科,但仍然可能存在这样的情况:本书所涵盖的某些方法,对于某些研究领域而言会比对另外一些领域更为重要。
本书涵盖的主题
除其他内容外,本指南还将讨论以下主题:
什么是 Meta 分析,以及它为何会被发明出来。
Meta 分析的优势及其常见问题。
如何界定 Meta 分析的研究问题,以及如何开展研究检索。
如何安装 R,以及如何安装一个能够更方便使用 R 的计算机程序。
如何将 Meta 分析数据导入 R,并通过代码对其进行处理。
什么是效应量,以及如何计算效应量。
如何在固定效应与随机效应 Meta 分析中合并效应量。
如何分析 Meta 分析中的异质性,以及如何通过亚组分析和 Meta 回归来探索异质性。
选择性结局报告所带来的问题,以及如何应对这些问题。
如何实施一些高级类型的 Meta 分析技术,例如“多层次”Meta 分析、Meta 分析结构方程模型、网络 Meta 分析,或贝叶斯 Meta 分析。
如何报告你的 Meta 分析结果,并使其具有可重复性。
如何使用本书
工作流程
本书适合以“线性”的方式阅读。我们建议你从关于 Meta 分析基础和 R 基础的前几章开始,然后一章接一章地往后学习。直接跳到实操章节看起来可能很诱人,但总体来说并不推荐这样做。
在教学生和研究者完成他们第一次 Meta 分析的过程中,我们发现,为了避免后续挫败感,对这项技术本身以及 R Studio 环境有基本熟悉,虽然有点“不得不做”,却十分必要。尤其是当你之前完全没有 Meta 分析和 R 编程经验时,更是如此。已经熟悉 R 的读者可以跳过介绍 R 和 R Studio 的第 2 章。不过,即便如此,把这一章再过一遍,作为一次简短复习,也不会有什么坏处。
虽然所有章节基本都可以独立阅读,但我们有时也会引用前面章节中讲过的主题。尤其是“高级方法”部分中的章节,会默认你已经熟悉此前介绍过的一些理论概念。
本书最后一部分包含一些对你的 Meta 分析有帮助的工具。这并不意味着这些主题是在真正开展 Meta 分析时最后才需要考虑的事情。我们之所以把这些章节放在最后,只是因为它们更多是作为你自己 Meta 分析项目中的参考资料来使用。我们会在全书中,于它们在主题上相关的地方链接到这些工具。
配套 R 包
本书配有一个名为 {dmetar} 的 R 包。这个包主要有两个作用。第一,它旨在让你的操作更轻松。虽然目前已经存在许多出色的 Meta 分析 R 包,并且它们具备非常广泛的功能,但对于初学者来说,仍有少数任务在 R 中并不那么容易实现。
{dmetar} 包的目标,就是通过提供一些额外函数来弥补这一空白,从而帮助你更方便地完成这些任务。第二,这个包还包含了本书中实操示例所使用的全部数据集。在第 2.3 节中,我们会详细介绍 {dmetar} 包,并一步一步演示如何安装它。
尽管我们会尽量确保不会有重大变化,但 {dmetar} 目前仍处于持续开发之中,因此你不妨时不时查看一下其包网站,看看是否有新的或改进的功能可以用于你的 Meta 分析。
尽管我们建议安装它,但这并不是必须的。凡是在书中使用到 {dmetar} 的地方,我们也会同时提供该函数的原始代码,或给出所用数据集的下载链接。
文本框
全书中会使用一组文本框。
一般说明
一般说明框包含与当前主题相关的背景信息、见解、轶事、考虑事项或核心要点。
重要信息
这类文本框包含你需要牢记的注意事项、问题、缺点或陷阱。
问题
每章结束后,这个文本框中都会给出一些问题,供你检验自己的掌握情况。这些问题的答案可以在全书末尾的附录 A中找到。
{dmetar} 说明
当使用配套 R 包中的函数或数据集时,就会出现 {dmetar} 说明框。这些文本框也会为未安装该包的读者提供函数代码的 URL,或数据集下载链接。
我该如何报告这一结果?
这些文本框会给出建议,说明你如何在学位论文或研究论文中报告 R 输出结果。
约定
本书通篇遵循若干约定。
{packages}
所有 R 包名称都以加粗形式书写,并置于花括号中。这是 R 社区中书写包名的一种常见方式。
R Code
我们在 R 中编写的所有代码,或在 R 中定义的对象,都会使用这种等宽字体表示。
## R Output
运行 R 代码后得到的输出也使用同样的等宽字体。不过,我们会在前面加上两个井号(hashes)来将其与 R 输入区分开来。
Formula
这种衬线字体专用于公式、统计量以及其他数学记号。
当你卡住时该怎么办
不可否认,使用 R 做 Meta 分析这条路有时会相当崎岖。虽然我们认为这种说法有时被夸大了,但 R 的学习曲线确实比较陡峭。统计学也并不轻松。我们已经尽最大努力,让你学习如何用 R 实施 Meta 分析的过程尽可能少一些痛苦。然而,这也并不能保证你不会时不时感到沮丧——这完全正常。我们每个人都是从零开始的。
根据我们自己的经验,我们可以向你保证:我们从未见过有人学不会 R,或学不会如何做 Meta 分析。它所需要的只是练习,以及明白这样一个事实:你永远不会到达一个“我已经学完了”的时刻。我们相信你可以做到。
如果你想要比这种鼓励性表述更实际一点的建议:当你遇到本指南无法解答的问题时,下面是一些你可以采取的做法。
不要惊慌
很多人在刚开始学习 R 时,一看到第一条红色报错信息弹出来就会害怕。其实没有必要。每个人都会经常遇到报错信息。与其惊慌失措,或者想把电脑扔出窗外,不如先深呼吸,然后仔细看看报错信息写了什么。很多时候,只需要做几个小修改,报错就会消失。是不是把代码里某个词拼错了?是不是忘记闭合括号了?或者忘记给某些内容加引号了?
另外,也要确认你的输出是否真的属于错误信息。R 会区分 Error 、Warning ,以及普通消息。只有第一种意味着你的代码无法执行。Warning 表示代码已经运行,但某些地方可能出现了问题。普通消息则表示代码已经完整运行,通常是函数想提醒你它在底层替你完成了某件事情。因此,这类消息也被称为诊断信息(diagnostic messages)。
有一位做软件开发的朋友曾对本书第一作者讲过这样一个关于自己职业的笑话:“程序员,就是一个比普通人更会 Google 的人。” 这一观察同样非常适用于 R 编程。如果你遇到某条错误信息或警告信息却看不懂,不要犹豫,直接把它复制粘贴到 Google 里搜索。通常在搜索词后面加上 “R” 会更有助于提高结果的相关性。
另一个很好的选择是 rseek.org,它允许你进行 Google 搜索,同时自动过滤掉与 R 无关的结果。互联网上的大部分内容都是英文的;因此,如果你在 R 中看到的错误信息是其他语言,可以先运行 Sys.setenv(LANGUAGE = "en"),然后重新运行你的代码。
R 社区非常庞大,因此你遇到的问题,很可能之前已经有人遇到过。Google 也非常适合用来搜索你想对数据做某件具体事情、但又不知道该使用哪些 R 命令时的答案。即便对于专家来说,写 R 代码时一天 Google 十几次也是再正常不过的事。每当你卡住的时候,也请毫不犹豫地这样做。
StackOverflow 与 CrossValidated
当你在 Google 上搜索与 R 有关的问题时,很快就会发现,很多搜索结果的前几条都会把你带到一个名为 StackOverflow 的网站。StackOverflow 是一个大型的、以社区为基础的编程问答论坛。在 StackOverflow 上,任何人(包括你)都可以提问和回答问题。
与互联网中很多其他论坛不同,StackOverflow 上得到的回答通常目标明确,而且很有帮助。如果 Google 搜索没有帮你解决问题,那么去那里发问往往是一个不错的选择。不过,有几点需要记住。首先,提问时一定要给你的问题加上 [R] 标签,这样大家才能知道你说的是哪种编程语言。另外,请在 R 中运行 sessionInfo() ,并把得到的输出附在你的问题里。
这样别人就能知道你使用的是哪个版本的 R 和哪些包,也可能有助于定位问题。
最后,不要期待压倒性的热情和友善。许多 StackOverflow 用户都是经验丰富的程序员,他们也许愿意为你指出某些解决方向;但不要指望别人替你把问题完全解决掉。也有可能别人只是告诉你,这个主题在其他地方已经讨论过了,然后给你一个链接就离开。尽管如此,对于你正在处理的特定问题,StackOverflow 通常仍然是获得高质量支持的最佳方式。
顺便说一句,StackOverflow 主要适用于编程问题。如果你的问题同时具有统计学背景,那么你可以转而使用 CrossValidated。CrossValidated 的运作方式与 StackOverflow 相似,但其用户主要是统计学和机器学习领域的专家。
联系我们
如果你觉得自己的问题可能与本指南本身有关,也可以联系我们。这尤其适用于与本指南配套 R 包 {dmetar} 有关的问题。如果你在安装该包或使用其中某些函数时遇到困难,可以访问我们的网站,在那里你可以找到报告问题的方式。对于某些经常出现的问题,我们通常会尽量查看并寻找修复方案。
已知问题也会显示在本指南在线版本的 “Corrections & Remarks” 部分中(见“工作流程”一节)。如果我们没有亲自回复你的问题,或者回复需要较长时间,也请不要失望。我们每天都会收到许多与 Meta 分析以及我们的软件包有关的问题,因此有时确实无法立即逐一作答。
致谢
我们要感谢 David Grubbs 以及 Chapmann & Hall/CRC Press,他们向我们提出了一个非常美妙的想法:将我们的在线指南整理成你现在读到的这本纸质书;同时也感谢他们提供了极其宝贵的编辑支持。
自 2018 年底我们开始撰写本指南的早期在线版本以来,许多研究者和学生都向我们分享了他们使用本指南的反馈和经验。这些反馈极其宝贵,也极大帮助我们将本书进一步打磨得更贴近读者的实际需求。向你们所有人致谢。
我们对所有参与构建本指南所呈现之 R 语言 Meta 分析基础设施的研究者都心怀深深的感激;但首先尤其要感谢 {meta} 包和 {metafor} 包的维护者 Guido Schwarzer 与 Wolfgang Viechtbauer。没有你们的努力与投入,这本指南——以及整个 R 语言 Meta 分析社区——都不会存在。
此外,我们还要特别感谢精美的 {robvis} 包作者 Luke McGuinness。他为本书的配套网站撰写了关于偏倚风险可视化的附加章节。Luke,我们由衷感谢你持续不断地支持这一项目。
最后但同样重要的是,我们要感谢 Lea Schuurmans、Paula Kuper 和 Antonia Sprenger,感谢她们在本书开发与编纂过程中给予的支持。
