R语言纵向数据分析:3步完成dental数据集描述性统计与相关性检验
R语言纵向数据分析实战dental数据集三步探索法在生物统计和医学研究中纵向数据longitudinal data分析一直是核心方法之一。这类数据记录了同一组个体在不同时间点的多次观测能够揭示变量随时间变化的动态规律。今天我将以经典的dental数据集为例带您用R语言完成一套标准化的探索性分析流程。不同于零散的教程本文将呈现一个清晰可复现的三步分析框架特别适合R语言初学者和医学生物统计方向的研究者快速上手。1. 数据准备与结构转换任何数据分析的第一步都是理解数据结构并进行必要的整理。dental数据集记录了27名儿童在8岁、10岁、12岁和14岁时的牙齿生长测量值单位毫米包含以下变量id儿童编号sex性别0女孩1男孩y8, y10, y12, y14对应年龄的测量值# 加载必要包 library(tidyverse) # 数据处理 library(rstatix) # 描述性统计 library(ggpubr) # 统计可视化 library(GGally) # 高级可视化 # 下载并加载数据 load(url(http://alecri.github.io/downloads/data/dental.RData)) # 查看原始数据结构 head(dental)纵向数据分析通常需要长格式数据而原始数据是宽格式每个时间点作为单独列。我们用pivot_longer进行转换dental_long - dental %% pivot_longer(cols starts_with(y), names_to measurement, values_to distance) %% mutate( age parse_number(measurement), # 从列名提取年龄 measurement fct_inorder(paste(Measure at age, age)) # 有序因子 ) # 查看转换后数据 glimpse(dental_long)提示长格式数据中每个观测时间点占一行更适合用ggplot2绘制时间趋势图。转换后的数据新增了age数值型和measurement因子型两列后者保留了原始测量标签。2. 描述性统计与可视化探索2.1 基础统计量分析我们先计算各年龄点的牙齿生长测量值的描述统计# 整体描述统计 desc_stats - dental_long %% group_by(age) %% get_summary_stats(distance, type common) print(desc_stats) # 按性别分组的描述统计 desc_stats_sex - dental_long %% group_by(sex, age) %% get_summary_stats(distance, show c(mean, sd, min, max)) print(desc_stats_sex)关键指标解读均值mean反映牙齿生长的集中趋势标准差sd个体间变异程度极值min/max识别异常值2.2 数据可视化统计表格虽精确但可视化能更直观展示模式。我们使用ggplot2绘制三种关键图形箱线图展示分布ggplot(dental_long, aes(measurement, distance, fill measurement)) geom_boxplot() geom_jitter(width 0.2, alpha 0.5) # 添加数据点 labs(x 测量时间点, y 牙齿生长量(mm)) theme_minimal() guides(fill none) # 隐藏图例分组均值变化趋势dental_long %% group_by(sex, age) %% summarise(mean_distance mean(distance), .groups drop) %% ggplot(aes(age, mean_distance, color factor(sex))) geom_line(size 1) geom_point(size 3) labs(x 年龄(岁), y 平均牙齿生长量(mm), color 性别) scale_color_manual(values c(#E69F00, #56B4E9), labels c(女孩, 男孩)) theme_bw(base_size 12)个体生长轨迹意大利面图ggplot(dental_long, aes(age, distance, group id, color factor(sex))) geom_line(alpha 0.6) labs(x 年龄(岁), y 牙齿生长量(mm), color 性别) scale_color_manual(values c(#E69F00, #56B4E9), labels c(女孩, 男孩)) facet_wrap(~ sex) # 按性别分面 theme_minimal()3. 相关性分析与高级可视化纵向数据的一个重要特征是时间点间的相关性。我们通过以下方法分析3.1 协方差与相关系数矩阵# 计算协方差矩阵 cov_matrix - dental %% select(starts_with(y)) %% cov() # 转换为相关系数矩阵 cor_matrix - cov2cor(cov_matrix) print(cor_matrix)3.2 相关性可视化使用GGally包的ggpairs函数创建高级散点图矩阵ggpairs(dental, columns 3:6, # 选择y8-y14列 mapping aes(color factor(sex)), lower list(continuous smooth), upper list(continuous wrap(cor, size 4)), diag list(continuous wrap(densityDiag, alpha 0.5))) scale_color_manual(values c(#E69F00, #56B4E9)) scale_fill_manual(values c(#E69F00, #56B4E9)) theme_bw(base_size 10)该图包含三个部分对角线各变量的密度分布下三角平滑曲线拟合的散点图上三角相关系数及显著性3.3 时间自相关分析对于纵向数据我们常关注自相关autocorrelation——同一指标在不同时间点的相关性# 计算滞后1期的自相关 library(psych) autocor - describeBy(dental[,3:6], group NULL) print(autocor) # 可视化自相关 acf_plot - acf(dental[,3:6], plot FALSE) plot(acf_plot, main 牙齿生长测量的自相关函数)进阶技巧与注意事项在实际分析中有几个关键点需要注意缺失数据处理# 检查缺失值 sum(is.na(dental_long)) # 多重插补示例需安装mice包 # library(mice) # dental_imp - mice(dental, m5, maxit50, methpmm, seed500)统计检验# 性别差异的非参数检验 dental_long %% group_by(age) %% wilcox_test(distance ~ sex) %% adjust_pvalue(method bonferroni) %% add_significance()模型诊断# 线性混合模型示例 library(lmerTest) model - lmer(distance ~ age * sex (1|id), data dental_long) summary(model) # 模型诊断图 plot(model) qqnorm(resid(model))通过这三大步骤我们完成了从数据整理到描述统计再到相关性分析的完整流程。这个框架不仅适用于dental数据集也可迁移到其他纵向数据分析场景。在实际项目中我通常会保存关键结果到R Markdown报告方便结果共享和复查# 保存关键图形 ggsave(growth_trend.png, width 8, height 6, dpi 300) # 保存统计结果 write_csv(desc_stats_sex, descriptive_stats.csv)最后提醒初学者纵向数据分析方法选择需考虑数据特性如测量间隔、缺失模式和研究问题。本文介绍的方法属于探索性分析更复杂的模型如混合效应模型、GEE等需要在掌握基础后进一步学习。