R语言全流程建模:从线性回归到混合效应模型与GAM
2026/8/31 1:57:50 网站建设 项目流程

在实际数据分析项目中,回归和混合效应模型很少是孤立使用的。很多生态学、医学、教育学和经济学课题,前期需要用 R 语言完成数据清洗和探索,中期用 lm、glm 建立基准模型,遇到分组、重复测量、时间或空间相关结构时又要切换到 lmm、glmm,最后还常用 GAM 捕捉非线性趋势。常见的问题是:每个模型单独学习时都能理解,可一旦面对一套完整数据,从 R 语言基础到回归、混合效应模型、时间空间系统发育分析、GAM、结果绘图的流程却接不起来。

这篇文章以 R 语言为核心,把这条完整流程拆成六大单元来梳理。你会看到环境与依赖如何准备,lm、glm、lmm、glmm 的公式语法如何逐层扩展,时间、空间、系统发育三种非独立数据结构在回归中怎么处理,GAM 的平滑项如何设置和解释,以及最后如何把模型输出变成可直接放进报告或论文的图。文中代码以 R 语言常见包为基础,尽量给出最小可运行示例,方便你结合自己的数据改造。

1. 环境准备:R 语言版本、项目目录和关键包

1.1 R 语言与 RStudio 的安装对齐

学习环境里,建议使用 R 语言 4.x 版本配合 RStudio 操作。R 语言负责计算和包管理,RStudio 提供脚本编辑器、环境变量查看、绘图窗口和 Git 集成。两者的关系是:RStudio 依赖本机 R 语言解释器,安装顺序应当先装 R,再装 RStudio。

不同系统安装时注意区分:

系统安装方式建议检查点
Windows下载 R 安装包,安装时选择“能为当前用户安装”启动 RStudio 后执行R.version.string查看版本
macOS通过 Homebrew 或官方安装包安装安装 Xcode Command Line Tools,否则部分包无法编译
Linuxsudo apt install r-base-core或从源码编译确认libcurllibxml2等系统依赖已安装

安装完成后,可以在 RStudio 的 Console 中执行:

R.version.string getwd()

getwd()返回当前工作目录。R 语言默认把文件读写路径锚定在工作目录,后续所有数据读取和结果保存都受它影响。建议不要使用默认的“我的文档”,而是在项目里单独建目录。

1.2 项目目录结构与数据读取

数据分析项目容易在三个月后变得无法复现,因为脚本、数据、图、结果混在一起。推荐从项目第一天就按下面结构组织:

project/ ├── data/ │ ├── raw/ # 原始数据,不修改 │ └── processed/ # 清洗后数据 ├── scripts/ # R 脚本 ├── output/ │ ├── figures/ # 图表 │ └── tables/ # 结果表 └── docs/ # 笔记和报告

读取数据最常用的是将 CSV 文件放入data/raw/,然后使用readr包读取:

library(readr) library(dplyr) df <- read_csv("data/raw/my_data.csv") glimpse(df)

glimpse()能快速查看列类型和少量数据,比str()更适合排查“列类型读错”的问题。常见问题是 Excel 中的空值被读成空白字符串,或者数值列因为混入文本而变成字符型。读取后先检查summary(df),确认变量类型符合预期,再进行建模。

1.3 六大模型流程需要的 R 包清单

不同类型的模型由不同 R 包承担。安装时最好一次安装完整套,避免中途缺包打断流程:

install.packages(c( "tidyverse", # 数据清洗和可视化 "lme4", # lmm 和 glmm "nlme", # 线性混合模型和时间空间相关结构 "mgcv", # GAM "ggeffects", # 边际效应预测 "performance", # 模型诊断 "see", # 绘图主题 "readr", # 数据读取 "broom" # 模型结果转为数据框 ), repos = "https://cloud.r-project.org")

包安装完成后,每个脚本开头按需加载即可。不需要每次都把所有包加载进来,加载过多包会增大同名函数冲突的概率。例如nlmelme4都提供lmelmer相关函数,两个包同时加载时要注意mask提示。

注意:R 语言包更新频率较高,如果代码在别人电脑上跑不起来,先看sessionInfo()输出的包版本,版本差异是常见根因。

2. 从 lm 到 glm:先搭起回归模型的通用骨架

2.1 lm() 的最小闭环:拟合、摘要、预测

线性模型是回归分析的起点。R 语言里lm()函数参数结构非常稳定:第一个参数是公式,第二个参数是数据框。以mtcars数据为例,研究油耗mpg受车重wt和马力hp的影响:

mod_lm <- lm(mpg ~ wt + hp, data = mtcars) summary(mod_lm)

summary()输出包含五个部分:残差分布、回归系数、显著性检验、调整 R 方、F 检验。回归系数中的Estimate表示在其他变量不变的情况下,该变量每增加一个单位,因变量的平均变化量。

再使用预测值检查拟合效果:

df_pred <- mtcars df_pred$pred <- predict(mod_lm, newdata = mtcars) head(df_pred[, c("mpg", "pred", "wt", "hp")])

predict()是 lm、glm、lmm、glmm、GAM 共用的接口,参数newdata接收用于预测的数据框。数据框的列名必须和建模时使用的变量名完全一致,否则会报newdata缺少变量。

2.2 summary() 里每个指标该怎么读

回归输出的指标不能只看 P 值。首先要看模型整体的 F 检验是否显著,再看每个系数的标准误和置信区间。标准误过大通常说明变量之间存在多重共线性或样本量不足。

可以使用confint()获得系数的置信区间:

confint(mod_lm, level = 0.95)

如果置信区间跨过 0,说明该变量的效应方向不稳定,不能简单地因为它 P 值小于 0.05 就宣称有强效应。

还要检查残差的正态性和方差齐性。R 基础绘图函数plot(mod_lm)会生成四张诊断图:

par(mfrow = c(2, 2)) plot(mod_lm) par(mfrow = c(1, 1))

残差图出现喇叭形,说明存在异方差;残差 Q-Q 图中点严重偏离对角线,说明正态性假设可能不满足。这些情况不一定需要立即放弃线性模型,但提示你要考虑变量变换、加权最小二乘或广义线性模型。

2.3 glm() 的 family 参数:逻辑回归与泊松回归

广义线性模型把线性模型的框架扩展到非正态分布响应变量。核心参数是family,它决定了响应变量的分布和连接函数。

# 逻辑回归:响应变量为 0/1 mod_glm <- glm(am ~ wt + hp, data = mtcars, family = binomial) summary(mod_glm) # 泊松回归:响应变量为计数 # 假设 df 中有 count 和 x 变量 # mod_pois <- glm(count ~ x, data = df, family = poisson)

family常见的取值有:

family响应变量类型默认连接函数典型场景
gaussian连续正态分布identitylm()等价
binomial0/1 或比例logit分类、成功失败
poisson非负整数计数log计数数据
Gamma正数偏态inverse时间、费用等
quasipoisson过离散计数log计数方差远大于均值

逻辑回归的输出中,系数是 log-odds 形式,需要取指数才能解释为比值比:

exp(coef(mod_glm))

例如wt的系数为负,说明车重越大,车辆属于手动挡的概率越低。exp(系数)表示车重每增加一个单位,成为手动挡的 odds 变为原来的多少倍。

泊松回归中则关注是否需要处理过离散。简单检查方式是:

# 用残差偏差除以剩余自由度,如果远大于 1 则存在过离散 deviance(mod_glm) / df.residual(mod_glm)

2.4 模型比较与选择:anova、AIC 与交叉验证

模型比较常见有三种方式:似然比检验、信息准则和交叉验证。嵌套模型可以用anova()

mod_lm1 <- lm(mpg ~ wt, data = mtcars) mod_lm2 <- lm(mpg ~ wt + hp, data = mtcars) anova(mod_lm1, mod_lm2, test = "F")

非嵌套模型常用 AIC:

AIC(mod_lm1, mod_lm2)

AIC 越小表示模型在拟合优度和复杂度之间取得更好的平衡。需要注意的是,AIC 只能用于相同数据、响应变量相同且样本量相同的模型比较。

交叉验证在真实项目中更可靠。可以使用caret包或手动实现 K 折交叉验证,这里给出一个最小结构:

set.seed(123) folds <- sample(1:5, nrow(mtcars), replace = TRUE) rmse <- numeric(5) for (i in 1:5) { train_data <- mtcars[folds != i, ] test_data <- mtcars[folds == i, ] mod <- lm(mpg ~ wt + hp, data = train_data) pred <- predict(mod, newdata = test_data) rmse[i] <- sqrt(mean((test_data$mpg - pred)^2)) } mean(rmse)

交叉验证的价值在于避免只依赖训练集上的拟合指标。建模过程中建议把set.seed()固定下来,保证结果可复现。

3. 混合效应模型(lmm/glmm):处理非独立数据结构

3.1 为什么普通回归处理不了重复测量和分组数据

普通lm()glm()假设每条观测相互独立。但很多实验和调查数据并不满足这一假设:同一名患者有多次随访记录,同一个班级有多个学生,同一块样地中有多个植株。这些数据在分组内部存在相关性,如果忽略,会低估标准误,导致假阳性率上升。

混合效应模型通过引入随机效应来处理这个问题。固定效应表示我们关心的总体平均效应,随机效应表示不同分组截距或斜率对平均效应的偏移。这样既估计了总体趋势,又保留了个体差异。

某个变量到底应该设为固定效应还是随机效应,是一个反复出现的问题。经验法则是:如果该变量的水平代表你关心的科学问题,且需要解释系数,就设为固定效应;如果它只是数据分层或重复测量的来源,而你关心的是整体趋势而不是每个层级的估计值,就设为随机效应。

3.2 lmer() 与 glmer() 的语法规则

lme4包提供lmer()用于线性混合模型,glmer()用于广义线性混合模型。公式语法与lm()相似,区别在于多了一部分以括号表示的随机效应项。

最简单的随机截距模型:

library(lme4) # sleepstudy 是 lme4 内置数据集,研究睡眠剥夺对反应时间的影响 mod_lmm <- lmer(Reaction ~ Days + (1 | Subject), data = sleepstudy) summary(mod_lmm)

(1 | Subject)表示截距随Subject变化。随机截距的含义是:每个受试者的基础反应时间不同,但 Days 对反应时间的斜率是共享的。

随机斜率模型:

mod_slope <- lmer(Reaction ~ Days + (Days | Subject), data = sleepstudy)

(Days | Subject)表示每个受试者有自己的截距,也有自己的 Days 斜率。这里要注意,随机斜率会引入更多待估方差协方差参数,数据量不足时容易导致模型不收敛。

glmer()的用法类似,只是加入family参数:

# cbpp 是包含牛群疾病数据的数据集 mod_glmm <- glmer(cbind(incidence, size - incidence) ~ period + (1 | herd), data = cbpp, family = binomial)

cbind(成功数, 失败数)是二项式响应的一种输入格式。响应变量也可以是 0/1 向量,两种方式等价。

3.3 随机截距、随机斜率和嵌套结构怎么写

随机效应部分写在公式右侧的括号中。常见写法:

写法含义适用场景
`(1group)`随机截距
`(xgroup)`随机截距和 x 的随机斜率
`(1g1 / g2)`嵌套结构,g2 嵌套在 g1 中
`(1g1) + (1g2)`

嵌套与交叉是新手最常混淆的结构。嵌套指一个层级只属于上一层级的某个单位,例如学生只属于一所学校;交叉指同一个单位同时属于多个分组,例如同一批试卷被一群人评分,每个人评多份。

嵌套结构示例:

# student 嵌套在 class 中 # mod_nested <- lmer(score ~ teaching_method + (1 | class / student), data = school_data)

交叉结构示例:

# 同一批被试参加多个任务,任务和被试交叉 # mod_cross <- lmer(response ~ condition + (1 | subject) + (1 | item), data = exp_data)

3.4 收敛警告、奇异拟合和样本量不足的排查

混合效应模型最常见的错误是收敛警告。运行lmer()glmer()时,可能看到:

Warning message: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, : Model failed to converge with max|grad| = 0.002 ...

处理顺序建议如下:

  1. 更改优化器和增加迭代次数:
mod_lmm2 <- lmer(Reaction ~ Days + (Days | Subject), data = sleepstudy, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))
  1. 查看随机效应方差是否等于 0,或相关系数是否接近正负 1:
VarCorr(mod_lmm2)
  1. 如果随机效应方差接近 0,说明该随机效应可能没有必要,考虑简化模型。

还需要区分“数值警告”和“逻辑错误”。有时候模型虽然收敛,但随机斜率方差被估计为 0,这叫做奇异拟合,通常是因为随机效应的信息量不足。这时不要强行保留复杂随机效应结构,应根据研究设计谨慎简化,并在论文或报告中说明模型选择步骤。

注意:混合效应模型的自由度计算、P 值估算和参数 bootstrap 在学术界仍有讨论。报告结果时不要只写 P 值,应同时报告固定效应估计、标准误和随机效应方差,必要情况下给出置信区间。

4. 时间、空间与系统发育数据的回归扩展

4.1 时间自相关:用 gls() 加入相关结构

时间序列数据中,靠近时间点的观测往往更相似,残差因此会存在自相关。nlme包的gls()函数可以在模型中显式加入时间相关结构。

ChickWeight数据为例,研究小鸡体重随时间变化,并考虑同一只鸡在不同时间点的相关性:

library(nlme) mod_gls <- gls(weight ~ Time + Diet, data = ChickWeight, correlation = corAR1(form = ~ Time | Chick), method = "REML") summary(mod_gls)

corAR1()表示一阶自回归相关结构,form = ~ Time | Chick表示按照时间排序,在每只鸡内部建立相关。如果不加correlation,模型默认假设所有观测独立,这在时间数据中通常是不合理的。

常见相关结构:

函数结构适用场景
`corAR1(form = ~ timegroup)`一阶自回归
`corExp(form = ~ x + ygroup)`指数空间相关
`corGaus(form = ~ x + ygroup)`高斯空间相关
`corSymm(form = ~ 1group)`无约束相关矩阵

gls()的结果解释与lm()类似,但它能给出更合理的标准误估计,因为模型没有忽略数据内部的相关性。

4.2 空间自相关与空间回归

地理或生态数据中,样点距离越近,观测值往往越相似,这被称为空间自相关。处理空间数据的第一步是检验空间自相关是否存在,常见工具是spdep包的moran.test()

空间数据回归通常有两条路线:

第一条是在gls()中加入空间相关结构,适合处理连续空间梯度中的残差相关:

# mod_spatial <- gls(y ~ x1 + x2, # data = spatial_data, # correlation = corExp(form = ~ lon + lat))

第二条是使用空间回归模型分析直接的空间效应,例如spdep包的lagsarlm()errorsarlm()。这里不展开贝叶斯空间模型,但需要明确:如果数据存在明显空间聚类,并且这种聚类和自变量相关,普通回归会产生有偏估计。

空间数据的独立性问题与时间序列类似,区别在于空间数据的方向性更复杂。时间有明确的先后顺序,空间却没有唯一的“过去”和“未来”,所以空间相关结构需要根据经纬度或距离矩阵来确定。

4.3 系统发育非独立性:PGLS

在比较生物学和生态学研究中,物种数据不满足独立性假设,因为亲缘关系近的物种在性状上往往更相似。系统发育广义最小二乘(PGLS)通过在模型中加入系统发育相关结构来处理这种依赖。

phylolm包提供phylolm()函数,可以估计系统发育信号并控制物种间的相关性:

library(phylolm) # tree 是 phylo 对象,dat 包含物种性状数据 # mod_pgls <- phylolm(trait1 ~ trait2, # data = dat, # phy = tree, # model = "BM") # summary(mod_pgls)

model = "BM"表示布朗运动模型,是 PGLS 中最常用的系统发育模型假设。也可以使用"OU"模型处理性状漂移约束。phylolm()的估计结果会输出系统发育信号的估计,以及控制非独立性后的回归系数。

系统发育数据建模时,还有一个前置步骤是检查系统发育信号强度。可用phytools包的phylosig()函数计算出 PageI 的 λ 或 Blomberg 的 K 值。如果信号很弱,普通回归和 PGLS 的结果差别通常不大;如果信号强,忽略系统发育会低估标准误。

4.4 三种非独立结构的判断顺序

时间、空间和系统发育都违背了“观测独立”假设,但它们进入模型的层次不同。

建议按以下顺序判断:

  1. 检查数据是否存在按单位重复测量或分组结构,如果是,先考虑混合效应模型。
  2. 检查同一分组内是否还残留时间或空间上的相关性。如果分组内按时间排序,加入corAR1();如果按经纬度排列,加入corExp()
  3. 如果是物种比较数据,先做系统发育信号检验,信号显著则使用 PGLS。

一个常见误区是直接在lmer()中把时间序数当作固定效应,然后在模型中忽略残差自相关。固定时间项只能解释时间趋势,不能解决同一单位内残差的时序相关。正确的做法是同时保留时间趋势和合理的相关结构。

5. GAM:用平滑项扩展回归模型的非线性能力

5.1 GAM 要解决什么问题

广义加性模型(GAM)的核心思想是:不再假设因变量和自变量之间是严格的线性关系,而是允许每个变量通过平滑函数来影响因变量,然后对所有变量的平滑项和线性项求和。

普通回归写的是y ~ x1 + x2,GAM 写的是y ~ s(x1) + x2s()表示对x1生成一个平滑项。这样,当x1y的关系是倒 U 形、阶段性变化或其他复杂形态时,不需要手动构造多项式或分段变量。

R 语言中实现 GAM 最常用的是mgcv包。mgcv的优点在于:自动选择平滑参数、能处理广义分布族,并且可以实现随机效应和空间平滑项。

5.2 mgcv::gam() 最小案例

使用mtcars数据做一个 GAM 模型:

library(mgcv) mod_gam <- gam(mpg ~ s(wt) + s(hp), data = mtcars) summary(mod_gam)

输出中,每个平滑项会显示edf(有效自由度)。edf越大,说明平滑项越复杂。如果edf接近 1,说明该变量基本是线性关系,可以换回普通回归或在线性模型中使用lm()

查看平滑项的形态:

plot(mod_gam, pages = 1)

plot()可以画出每个平滑项的偏效应图。图中的阴影部分通常表示置信区间,曲线偏离 0 且有区间不包含 0 的区域,说明该区间内变量效应显著。

5.3 平滑项参数:bs、k 与 EDF 的解释

mgcvs()函数有多个参数:

参数含义默认值调整建议
bs平滑基函数类型"tp"(薄板样条)周期数据用"cc",一维数据用"cr"
k基函数维度上限常用 10 或自动选择越大表示可拟合更复杂的曲线,但容易过拟合
by按分组水平生成独立平滑项处理交互或分组差异

需要注意k并不等于曲线的自由度,它只是平滑项复杂度的上限。如果模型拟合后输出中提示k'接近edf,说明k可能太小,需要增大。

# 检查基本维度是否足够 gam.check(mod_gam)

gam.check()输出中会报告k'edf和 P 值。如果在显著性检验中edf接近k',需要考虑提高k的值。

5.4 GAM 的诊断与可视化

GAM 诊断的核心是检查残差分布和过拟合。除了gam.check(),也可以使用performance包:

library(performance) check_model(mod_gam)

结果可视化时,可以用ggeffectsmgcv自带的plot()来生成预测效应图:

library(ggeffects) pred <- ggpredict(mod_gam, terms = "wt") plot(pred)

ggpredict()会固定其他变量为均值或众数,展示目标变量变化时预测值的变化。还可以通过terms = c("wt", "hp")生成交互式效应数据,用于二维热图或等高线图。

GAM 使用中有一个容易忽略的问题:平滑项虽然能拟合复杂曲线,但解释性比普通回归系数差。需要报告平滑项的显著性、EDF、以及通过可视化展示曲线形态,而不是只列出数值。

6. 结果绘图:把模型估计变成读者能直接理解的图

6.1 数据探索图和模型诊断图

建模前用图做数据探索,能让变量关系更直观。基础散点图:

library(ggplot2) ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point(size = 2, alpha = 0.7) + geom_smooth(method = "lm", se = TRUE) + labs(x = "Weight (1000 lbs)", y = "Miles per gallon") + theme_minimal()

geom_smooth()中的method = "lm"可以换成"glm""gam",但通常探索阶段用"loess"展示局部趋势,进入正式模型后再用模型预测值绘图。

模型诊断图方面,performance包提供了统一接口:

library(performance) library(see) # lmm 的 QQ 图、残差图和收缩图 check_model(mod_lmm)

这些图能在几秒内暴露残差非线性、异方差、影响点等问题。实际项目中不要跳过诊断图直接汇报结论。

6.2 预测效应图和交互效应图

绘制模型预测图有两种常用方式。第一种使用ggpredict()生成边际效应数据:

library(ggeffects) pred_lm <- ggpredict(mod_lm, terms = c("wt")) plot(pred_lm) + labs(title = "Predicted MPG by Weight", x = "Weight (1000 lbs)", y = "Predicted MPG")

第二种是用predict()手动构造预测数据框,然后传给ggplot2。这种方式更适合需要完全控制绘图细节的场合:

new_data <- data.frame( wt = seq(min(mtcars$wt), max(mtcars$wt), length.out = 100), hp = mean(mtcars$hp) ) new_data$pred <- predict(mod_lm, newdata = new_data, se.fit = TRUE)$fit new_data$se <- predict(mod_lm, newdata = new_data, se.fit = TRUE)$se.fit ggplot(new_data, aes(x = wt, y = pred)) + geom_ribbon(aes(ymin = pred - 1.96 * se, ymax = pred + 1.96 * se), alpha = 0.2) + geom_line() + theme_minimal()

交互效应图需要同时变化两个变量。例如想查看wthpmpg的联合效应,可以使用:

new_data2 <- expand.grid( wt = seq(min(mtcars$wt), max(mtcars$wt), length.out = 30), hp = seq(min(mtcars$hp), max(mtcars$hp), length.out = 30) ) new_data2$pred <- predict(mod_lm, newdata = new_data2) ggplot(new_data2, aes(x = wt, y = hp, fill = pred)) + geom_tile() + scale_fill_viridis_c() + labs(x = "Weight", y = "Horsepower", fill = "Predicted MPG") + theme_minimal()

这种热图适合展示二维交互效应,比把多个曲线堆在一张图里更容易读。

6.3 出版级绘图与文件导出

RStudio 中绘图窗口的默认分辨率不够高。提交到论文或报告前,建议用ggsave()导出高分辨率图片:

ggsave("output/figures/mpg_pred.png", width = 7, height = 5, dpi = 300)

对于论文投稿,通常要求 300 dpi 的 TIFF 或 PDF。ggsave()会根据扩展名自动推断格式;也可以直接指定device = "pdf"

出版级绘图的几个建议:

  • 去掉多余网格线,使用theme_bw()theme_minimal()
  • 字体统一,建议使用base_size = 12base_size = 14
  • 颜色不要只依赖色相区分,使用viridis色板能在黑白打印时也保持可区分性。
  • 图表标题不要使用中文和英文混排导致的对齐问题,提交前检查字体渲染。
  • 图中不要堆放过多样本点,可以考虑加入透明度alpha或抽样展示部分点。

7. 常见问题排查与学习建议

7.1 高频报错与解决方案速查表

问题现象常见原因检查方式处理建议
函数找不到或could not find function包未安装或未加载installed.packages()library()加载包,确认函数所在包
公式包含变量不存在数据框中列名拼写错误names(df)统一列名,避免使用空格或特殊字符
newdata缺少变量预测数据框列名和建模变量不一致names(new_data)确保预测数据包含所有建模变量
lmer/glmer 不收敛优化器迭代不足或模型过度复杂查看 warning 和VarCorr()换优化器、增大maxfun、简化随机效应
固定效应和随机效应重名混淆变量名过于相似colnames(df)重命名变量,保持可读性
绘图中文显示为方框系统缺少中文字体windowsFonts()systemfonts设置theme(text = element_text(family = "Hei"))
ggpredict 对 lmer 返回错误包版本不匹配或模型包含不支持的结构sessionInfo()更新包,或将模型结果用predict()手动处理

7.2 学习环境与生产环境的关键差异

日常学习时,我们可以接受“能跑通就行”。但进入正式项目或论文分析阶段,要按生产级标准要求自己:

维度学习环境生产/论文环境
数据管理随便放在工作目录原始数据只读,清洗脚本和输出分离
随机种子不固定所有重采样和模拟过程固定set.seed()
版本管理不关心使用renvpackrat固定包版本
模型选择只看 P 值和 AIC同时报告模型诊断、变量筛选过程和敏感性分析
输出控制台打印结果导出为 CSV、RDS 或图为 PDF、PNG

生产环境中最重要的是可复现性。别人拿到你的代码和数据,应该在相同环境下得到相同结果。建议使用 RStudio 的 Project 功能和renv包记录依赖版本:

# 安装并初始化 renv install.packages("renv") renv::init()

renv::init()会为当前项目生成一个独立的库目录,并把包版本记录在renv.lock文件中。这样后期回看时能直接恢复环境的包版本。

7.3 后续学习路线

这篇文章覆盖的是从基础回归到复杂数据结构的全流程,但每个模块都还可以继续深挖:

  • lme4 之后,可以了解brms包提供的贝叶斯混合效应模型,它能给出完整后验分布并灵活处理复杂先验。
  • GAM 之后,可以学习mgcv::gam()中的按因子平滑、张量积交互和空间平滑。
  • 时间序列部分,可以继续学forecast包和tsibble系列工具,处理更复杂的季节性和多步预测。
  • 空间分析部分,使用sfspdep做矢量数据空间自相关分析,再进入INLArstan做贝叶斯空间模型。
  • 系统发育分析部分,可以在 PGLS 基础上继续学phytoolsapecastor,处理性状演化的不同模型假设。

实践中最重要的原则是:先判断数据结构,再选择模型,最后用图和诊断验证模型假设。不要一开始就用最复杂的模型,而是从简单模型出发,逐步增加必要复杂度,并不断用诊断结果检查模型是否真的需要更多参数。

学习这套流程时,建议准备一份公开数据集,按本文顺序走一遍:数据清洗、lm、glm、lmm、glmm、时间/空间/系统发育扩展、GAM、结果绘图。每完成一个模型就记录模型结果和诊断结论,这样最终形成的不是零散知识,而是一条可以迁移到新项目的分析流水线。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询