ARTICLE

R语言

R语言 (R Language) R语言是一种用于统计计算、数据可视化和数据分析的编程语言与自由软件环境,由新西兰奥克兰大学的 Ross Ihaka 和 Robert Gentleman 于 1993 年创建,现由 R 核心团队(R Core Team)维护。R 是S语言的方言实现,其名称来源于两位创建者名字的首字母,同时也是 S 语言的双关。作为GNU通用

浏览 0 更新 2025-12-01

R语言 (R Language)

R语言是一种用于统计计算数据可视化数据分析的编程语言与自由软件环境,由新西兰奥克兰大学的 Ross Ihaka 和 Robert Gentleman 于 1993 年创建,现由 R 核心团队(R Core Team)维护。R 是S语言的方言实现,其名称来源于两位创建者名字的首字母,同时也是 S 语言的双关。作为GNU通用公共许可证下的自由软件,R 在学术界、工业界和政府部门中广泛使用,尤其在统计学计量经济学生物统计学数据科学领域占据核心地位。

R 的设计哲学强调向量化运算函数式编程范式以及强大的交互式数据分析能力。与通用编程语言不同,R 从诞生之初便围绕统计思维构建,数据操作、模型拟合和可视化是其一等公民。截至 2025 年,CRAN(Comprehensive R Archive Network)上托管超过 20,000 个扩展包,覆盖几乎所有现代统计方法的实现。

历史沿革

R 的前身可追溯至贝尔实验室 John Chambers 等人于 1976 年开发的 S 语言。S 语言以"用交互式计算环境辅助数据分析"为目标,开创了统计编程的新范式。1993 年,Ihaka 和 Gentleman 在教学中发现 S 语言的商业实现(S-PLUS)许可费高昂,遂决定开发一个开源替代方案。初始版本于 1995 年以 GNU GPL 发布,1997 年成立核心团队,2000 年发布 1.0.0 版本。

与 S 语言相比,R 引入了词法作用域(Lexical Scoping)——这一设计决策使得闭包和惰性求值成为可能,极大地增强了语言的函数式编程表达能力。此外,R 从一开始就原生支持面向对象编程,提供 S3 和 S4 两套对象系统,以及后来引入的 R5(引用类)和 R6 类系统。

核心数据结构

R 语言的数据结构体系围绕统计数据的自然形态设计:

向量 (Vector)

向量是 R 中最基本的数据结构,所有标量本质上都是长度为 1 的向量。R 支持六种基本原子类型:逻辑型(logical)、整型(integer)、双精度浮点型(double)、复数型(complex)、字符型(character)和原始字节型(raw)。向量化运算是 R 计算效率的核心:对向量执行的算术运算会自动循环应用于每个元素,无需显式循环。

矩阵与数组 (Matrix \& Array)

矩阵是带有行和列维度属性的二维数组。R 提供丰富的矩阵运算函数:转置(\texttt{t()})、矩阵乘法(\texttt{\%*\%})、特征值分解(\texttt{eigen()})、奇异值分解(\texttt{svd()})和 QR 分解(\texttt{qr()}),这些直接支撑了计量经济学中普通最小二乘法主成分分析等核心方法的数值计算。

数组可以扩展至任意维度,这使得面板数据和时空数据的操作更为自然。

数据框 (Data Frame)

数据框是 R 最独特和实用的数据结构:它是一个列的列表,每列可以是不同的数据类型(数值、因子、字符串),但所有列必须等长。数据框的语义完全对应统计中的"数据集"概念——行是观测(Observations),列是变量(Variables)。这一设计使得建模函数(如 \texttt{lm()})可以直接以公式指定变量关系:

y ~ x1 + x2 + x3\texttt{y \textasciitilde\ x1 + x2 + x3}

公式系统(Formula Interface)是 R 统计建模的另一核心创新,它通过威尔金森-罗杰斯语法简洁地表达变量间的线性、交互和非线性关系。

列表 (List) 与因子 (Factor)

列表允许递归地包含任意类型的对象,是组织复杂分析结果(如模型拟合对象包含系数、残差、调用信息)的容器。因子是 R 对分类变量的实现,支持名义型和顺序型分类,在回归分析中自动展开为虚拟变量矩阵。

统计建模能力

R 的统计建模能力覆盖从经典到前沿的几乎所有方法,其核心统计包(stats 包)提供:

  • 线性模型与广义线性模型:\texttt{lm()} 拟合普通最小二乘回归,\texttt{glm()} 支持逻辑回归、泊松回归等广义线性模型。公式接口自动处理虚拟编码、交互项和多项式项。
  • 时间序列分析:\texttt{arima()} 实现 ARIMA 建模,\texttt{StructTS()} 拟合结构时间序列模型,\texttt{forecast} 包提供指数平滑和 ETS 方法。
  • 多变量分析:\texttt{prcomp()} 和 \texttt{princomp()} 执行主成分分析,\texttt{factanal()} 实现因子分析,\texttt{cancor()} 计算典型相关分析。
  • 非参数与稳健方法:\texttt{wilcox.test()}、\texttt{kruskal.test()} 实现秩检验,\texttt{MASS::rlm()} 提供稳健回归。
  • 混合效应模型:\texttt{lme4::lmer()} 拟合线性和广义线性混合模型,在面板数据分析中尤为重要。

在计量经济学领域,\texttt{plm} 包为线性面板数据模型提供了一套完整工具(固定效应、随机效应、一阶差分等),\texttt{AER} 和 \texttt{sandwich} 包提供异方差与自相关一致的协方差矩阵估计(HAC),\texttt{ivreg} 包实现工具变量回归,\texttt{systemfit} 包支持似不相关回归(SUR)和联立方程模型。\texttt{rugarch} 和 \texttt{rmgarch} 包用于金融时间序列的ARCH/GARCH建模。

数据可视化

R 的数据可视化分为三大体系:

  1. 基础图形系统:绘图由一系列可叠加的函数构成(\texttt{plot()} 初始化,\texttt{points()}、\texttt{lines()}、\texttt{text()} 添加元素),适用于快速探索性分析。
  2. lattice 包:基于克利夫兰的网格图形理论,通过公式接口实现多面板条件绘图,适合多元数据的分面展示。
  3. ggplot2 包:基于 Leland Wilkinson 的图形语法(Grammar of Graphics),将图形分解为数据、映射、几何对象、统计变换、坐标系和分面等组件,通过层次化叠加构建任意复杂度的图形。ggplot2 已成为 R 社区的可视化标准,并衍生出生态系统的众多扩展包。

交互式可视化方面,\texttt{plotly} 将 ggplot2 图形转换为交互式 Web 图形,\texttt{shiny} 则允许纯粹使用 R 代码构建交互式 Web 应用仪表板。

CRAN 与包生态系统

CRAN(Comprehensive R Archive Network)是 R 的扩展包仓库网络,截至 2025 年托管超过 20,000 个经质量审核的扩展包。每个包需通过严格检查:代码无错误和警告、文档完整、跨平台兼容。CRAN 任务视图将包按主题组织,如计量经济学(Econometrics)、贝叶斯推断、机器学习、时间序列等,为用户导航提供了结构化的入口。

除 CRAN 外,\texttt{Bioconductor} 项目专注于生物信息学和计算生物学领域,\texttt{ropensci} 则提供科学数据开放获取的工具链。\texttt{devtools} 和 \texttt{usethis} 包极大简化了包开发和项目管理流程。RStudio IDE(现更名为 Posit)为 R 提供了集成的写作、调试、包开发和版本控制环境,R Markdown 和 Quarto 则将代码、输出与叙事文本整合为可复现的研究报告和文档。

在经济学与计量经济学中的地位

R 在经济学界的应用持续增长,主要原因有三:

可复现性:R 脚本和 R Markdown 文档使从原始数据到最终报告的整个分析流程可追溯、可复现,契合现代开放科学的要求。前沿方法获取:学术期刊发表的计量新方法往往同时提供 R 包实现,使得前沿方法从论文到实践的传递周期极短。零经济成本:作为自由软件,R 消除了软件许可的经济壁垒,在发展中国家学术界和公共政策研究机构中得到广泛采用。

然而,R 也面临一些局限性:内存管理完全在 RAM 中进行,处理超大规模数据时受限于可用内存(尽管 \texttt{data.table} 和 \texttt{arrow} 等包已显著改善);相对于 Python 的Scikit-learnPyTorch 生态,R 在深度学习领域的生态较为薄弱;语言本身的语法一致性不足(S3/S4/R6 三套面向对象系统并行存在增加学习曲线)。

与 Python 和 Stata 的比较

与 Python 相比,R 的核心优势在于统计建模的"开箱即用"——基本回归、假设检验、诊断图无需额外安装包即可完成,建模的公式接口简洁而强大。Python 则在通用编程任务(文件处理、Web 抓取、API 集成)和深度学习领域更为便利。实践中,\texttt{reticulate} 包允许在 R 中调用 Python 模块,两个语言的协同使用日益普遍。

Stata相比,R 的灵活性、可扩展性和图形能力远胜一筹,且为免费软件。Stata 的优势在于其命令的一致性设计、官方文档的细致程度以及特定领域命令的标准化(如 \texttt{xtabond2} 用于动态面板 GMM 估计)。在实证产业组织和劳动经济学领域,Stata 仍占据惯性和制度性优势,但 R 的份额持续上升。

R 语言是连接统计理论、数据分析与科学传播的桥梁工具,其生命力来源于全球统计学家和数据分析师共同构建的开源知识基础设施。对于经济学研究者而言,熟练运用 R 意味着同时获取了最前沿的计量工具箱和可复现研究的方法论框架。