summary()table(), describe(), twogrps() | |||
t.test()wilcox.test(), chisq.test() | |||
aov()kruskal.test() | |||
cor.test() | |||
glm()coxph(), lm() | |||
survfit()coxph() |
需要同学们注意的是,本课程为实战课,所以不会和大家讲那些晦涩难懂的统计学具体原理和算法,我们作为医生医学生,其实只需要知道:在什么情况下应该用哪种统计学方法来实现我们的需求?
对于统计学原理,我会给大家总结一些课外链接,等大家有时间可以点进去查看:【人话统计学概念:T检验】 https://www.bilibili.com/video/BV1YcbAznEjr/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957[https://www.bilibili.com/video/BV1YcbAznEjr/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957]【人话统计学概念:ANOVA方差分析】 https://www.bilibili.com/video/BV1aPbAzEEcd/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957[https://www.bilibili.com/video/BV1aPbAzEEcd/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957]【【人话统计学概念】统计学经典两类错误 :第一类错误,第二类错误 不再傻傻分不清楚!核心记忆法~】 https://www.bilibili.com/video/BV1YkbGz5Ewk/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957[https://www.bilibili.com/video/BV1YkbGz5Ewk/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957]【人话统计学概念:置信区间!】 https://www.bilibili.com/video/BV14PtwziE6S/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957[https://www.bilibili.com/video/BV14PtwziE6S/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957]【彻底搞懂P值:P< 0.05到底在告诉我们什么?】 https://www.bilibili.com/video/BV1CJagzwEHJ/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957[https://www.bilibili.com/video/BV1CJagzwEHJ/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957]【【人话统计学概念】一次搞懂卡方检验三大类型:独立性检验、同质性检验、拟合优度检验!】 https://www.bilibili.com/video/BV15tHQzrECH/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957[https://www.bilibili.com/video/BV15tHQzrECH/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957]【logistic回归到底是什么?一个视频讲清楚!小白轻松上手】 https://www.bilibili.com/video/BV1RZ421N74k/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957[https://www.bilibili.com/video/BV1RZ421N74k/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957]【直观理解皮尔逊相关系数(r)和决定系数(r平方)】 https://www.bilibili.com/video/BV1Cx4y1r7v5/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957[https://www.bilibili.com/video/BV1Cx4y1r7v5/?share_source=copy_web&vd_source=676b76a2a1b388f37fdec94c879bb957]
一般是论文的第一和第二个表,用于展示样本特征,如年龄、性别比例、实验指标。
# 示例数据data <- data.frame(age = rnorm(100,60,10),sex = sample(c("Male","Female"),100, replace =TRUE))# 基本描述summary(data$age)table(data$sex)library(tidyverse)data%>% group
summary(age) 输出均值、中位数、四分位数。
table(sex) 显示男女比例。
我们想比较两组(如男性 vs 女性)在某一连续变量(如年龄)上的差异。在医学研究中,这属于两独立样本均值比较的典型问题。如果是kllip分级这种等级变量,则应该直接使用非参数检验或者卡方检验进行组间差异比较
data <- data.frame(age = rnorm(100,60,10),sex = sample(c("Male","Female"),100, replace =TRUE))
summary(data$age)table(data$sex)library(tidyverse)data1 <- data %>% group_by(sex)%>%summarise(Mean = mean(age),Sd = sd(age),Median = median(age))data1
在进行t检验前,需要判断数据是否服从正态分布。原因: t检验的前提是假定总体近似正态分布。若不满足,可改用非参数检验(Mann–Whitney U检验)。
# 按组进行正态性检验shapiro.test(data$age[data$sex =="Male"])shapiro.test(data$age[data$sex =="Female"])shapiro.test(data$age[data$sex])# 若样本量较大(n>50),可以用QQ图辅助判断ggplot(data, aes(sample = age, color = sex))+stat_qq()+stat_qq_line()+facet_wrap(~sex)+theme_bw(base_size =14)+labs(title ="正态性检验QQ图")
解释:
p > 0.05 → 近似正态分布,可用 t 检验;
p ≤ 0.05 → 拒绝正态假设,应使用 Mann–Whitney U 检验。
data <- as.data.frame(data)data$sex <- as.data.frame(data$sex)data$sex <- as.factor(data$sex)t.test(age ~ sex, data = data)test1 <- t.test(age ~ sex, data = data)test1$p.value# 若不满足正态分布test2 <- wilcox.test(age ~ sex, data = data)
data$sex <- as.factor(data$sex)运行后报错:
data$sex <- as.factor(data$sex)错误Jxtfrm.data.frame(:无法 xtfrm 数据帧#需要运行:data <- as.data.frame(data)
ggplot(data = data, aes(x = sex, y= age, colour = sex, fill = sex))+geom_boxplot()+labs(x ="Gender",y ="Age",title ="Distribution of Age by Gender")+theme_bw(base_size =14)+annotate(geom ="text", label = paste0("p = ",signif(test1$p.value,3)),x =1.5, y =max(data$age)+5)+annotate(geom ="segment",x =1, xend =2,y =max(data$age)+2, yend =max(data$age)+2,linewidth =0.3)

ggplot(data = data1, aes(x = sex, y= Mean, colour = sex, fill = sex))+geom_col()+labs(x ="Gender",y ="Age(Mean)",title ="Group Comparison (Mean ± SD)")+theme_bw(base_size =14)+geom_errorbar(aes(ymin = Mean - Sd, ymax = Mean + Sd),width =0.5, color ="black", linewidth =0.3)+annotate(geom ="text", label = paste0("p = ",signif(test1$p.value,3)),x =1.5, y =max(data$age)+3)+annotate(geom ="segment",x =1, xend =2,y =max(data$age), yend =max(data$age),linewidth =0.3)

卡方检验用于分类变量之间的关联分析,常见于以下研究情境:
我们直接用R模拟一个示例数据,表示**性别(Male/Female)与是否患病(Yes/No)**的关系。
### 构造示例数据 ####set.seed(123)data <- data.frame(sex = sample(c("Male","Female"),200, replace =TRUE),disease = sample(c("Yes","No"),200, replace =TRUE, prob =c(0.4,0.6)))table(data$sex, data$disease)
这里的
prob = c(0.4, 0.6)是用于设置疾病在两组中的比例,也是随机创建数据的参数,不需要管他,你也可以改成prob = c(0.3, 0.7)等任何比例
卡方检验(Chi-square test)比较的是实际观测频数与理论期望频数的差异。
fisher.test())。### 卡方检验 ####tbl <- table(data$sex, data$disease)chisq.test(tbl)chisq.test(tbl, correct =F)chisq.test(data$sex,data$disease)### Fisher精确检验(当样本量较小或期望频数<5) ####fisher.test(tbl)
correct = F表示不加校正**,即直接使用标准的 Pearson 卡方检验,SPSS 的 “Pearson 卡方检验” 默认 不加连续性校正, 但会在输出表格里单独列出一行 “Continuity Correction (Yates)”,因此,你在 SPSS 里看到的 Pearson χ² 值,对应的是 chisq.test(tbl, correct = FALSE) 的结果。提取 p 值:
test1 <- chisq.test(tbl)test1$p.value
用于说明分类比例结构差异。
library(tidyverse)data1 <- data %>%group_by(sex, disease)%>%summarise(n = n())ggplot(data1, aes(x = sex, y = n, fill = disease))+geom_bar(stat ="identity", position ="fill", color ="black")+scale_fill_brewer(palette ="Set2")+labs(x ="Gender",y ="Ratio",title ="Disease Distribution by Gender")+theme_bw(base_size =14)+annotate("text", x =1.5, y =1.05,label = paste0("p = ",signif(test1$p.value,3)))

在医学研究中,若我们要比较三个或以上独立组在一个连续变量上的均值差异,就需要使用 单因素方差分析(One-way ANOVA)。
常见应用场景:
⚠️ t检验只能比较两组均值,而 ANOVA 可以同时比较多组差异。
原假设(H₀): 各组总体均值相等。备择假设(H₁): 至少有一组均值不同。但 ANOVA 不能告诉你“哪两组不同”,此时需进一步进行 多重比较(post-hoc test)。
set.seed(123)data <- data.frame(group =rep(c("Control","Treatment_A","Treatment_B"), each =40),value =c(rnorm(40,60,8),rnorm(40,65,8),rnorm(40,70,8)))head(data)
单因素方差分析要求:
# 正态性(Shapiro–Wilk)by(data$value, data$group, shapiro.test)# 方差齐性检验(Levene检验)library(car)leveneTest(value ~ group, data = data)
若p > 0.05,认为数据满足假设,可进行ANOVA。若p ≤ 0.05,可考虑使用非参数检验(如Kruskal–Wallis)
fit <- aov(value ~ group, data = data)summary(fit)
输出中:
pval <- summary(fit)[[1]]$`Pr(>F)`[1]pval
TukeyHSD(fit)可得出各组之间的成对比较结果(含置信区间与p值)。
与前面章节保持一致的绘图风格
theme_bw(base_size = 14)+annotatep值标注
library(tidyverse)data1 <- data %>%group_by(group)%>%summarise(Mean = mean(value),Sd = sd(value))ggplot(data1, aes(x = group, y = Mean, fill = group))+geom_col(width =0.6, color ="black")+geom_errorbar(aes(ymin = Mean - Sd, ymax = Mean + Sd),width =0.3, linewidth =0.3)+labs(x =NULL,y ="Value (Mean ± SD)",title ="Group Comparison by One-way ANOVA")+theme_bw(base_size =14)+scale_fill_brewer(palette ="Set2")+annotate("text", x =2, y =max(data1$Mean + data1$Sd)+2,label = paste0("p = ",signif(pval,3)))
ggplot(data, aes(x = group, y = value, fill = group))+geom_boxplot(alpha =0.8)+labs(x =NULL,y ="Value",title ="Distribution of Values across Groups")+theme_bw(base_size =14)+scale_fill_brewer(palette ="Set2")+annotate("text", x =2, y =max(data$value)+2,label = paste0("p = ",signif(pval,3)))
TukeyHSD() 判断哪两组差异显著;Kruskal–Wallis 检验基于**秩次(rank)**而非原始数值。其原理是:将所有样本合并排序后,比较各组秩和的差异。
原假设(H₀): 各组总体分布相同(中位数相等)。备择假设(H₁): 至少有一组的分布不同。具体公式不展示了,大家有兴趣可以了解,但这个不重要。
set.seed(123)data <- data.frame(group =rep(c("Control","Treatment_A","Treatment_B"), each =40),value =c(rlnorm(40,4,0.4),# 对数正态分布rlnorm(40,4.2,0.4),rlnorm(40,4.4,0.4)))
kruskal.test(value ~ group, data = data)输出结果包括:
test_kw <- kruskal.test(value ~ group, data = data)test_kw$p.value
Kruskal–Wallis 检验若显著(p < 0.05),同样需要进一步进行成对比较(pairwise comparison):
pairwise.wilcox.test(data$value, data$group,p.adjust.method ="BH")# Benjamini–Hochberg校正
⚠️ 注意:
多重比较时必须使用 p 值校正(Bonferroni、BH等)。 输出表格展示各组两两比较的显著性差异。
Kruskal–Wallis 检验基于秩次,但仍可使用 ANOVA 相同的图形展示:
📘 直接复用前文绘图代码,仅替换 p 值来源:
pval_kw <- test_kw$p.valueggplot(data, aes(x = group, y = value, fill = group))+geom_boxplot(alpha =0.8)+labs(x =NULL,y ="Value",title ="Group Comparison (Kruskal–Wallis Test)")+theme_bw(base_size =14)+scale_fill_brewer(palette ="Set2")+annotate("text", x =2, y =max(data$value)*1.05,label = paste0("p = ",signif(pval_kw,3)))
library(CBCgrps)下面给出 CBCgrps 在“二分类分组”的核心用法,尽量精简、即插即用。
library(CBCgrps)data(df)# 内置示例,mort=alive/dead(二分类)tab <- twogrps(df, gvar ="mort")print(tab,quote=TRUE)# 带引号便于粘贴到 Word 后“文字转表格”
twogrps():二组基线表主函数;自动识别变量类型与分布: 分类→卡方/精确;正态数值→均值±SD + t 检验;非正态→中位数[IQR] + Wilcoxon。(mirrors.sjtug.sjtu.edu.cn[https://mirrors.sjtug.sjtu.edu.cn/cran/web/packages/CBCgrps/CBCgrps.pdf])res <- twogrps(df = df,gvar ="mort",p.rd =3,# p值保留3位小数(小于阈值显示 <0.001)norm.rd =2,# 正态变量保留位数sk.rd =2,# 偏态变量保留位数cat.rd =2,# 分类变量比例小数位ShowStatistic =TRUE,# 显示统计量(t/χ²等))print(res,quote=TRUE)library(openxlsx)write.xlsx(res$Table,"tab1.xlsx",rowNames=F,colNames=F)

maxfactorlevels/minfactorlevels:避免把日期/少取值数值错误地当作因子或反之。
sim/workspace:当列联表较大时,为 Fisher 精确检验启用蒙特卡洛与更大工作空间。
多组分组请用
multigrps()(用法与参数体系相同)。(mirrors.sjtug.sjtu.edu.cn[https://mirrors.sjtug.sjtu.edu.cn/cran/web/packages/CBCgrps/CBCgrps.pdf])
相关分析用于判断两个连续变量之间是否存在统计学相关关系。相关关系可分为正相关、负相关和无线性关系常见方法包括 Pearson 相关(正态)和 Spearman 相关(非正态或等级)。
我们用之前散点图的示例数据来展示分析的过程。
library(tidyverse)# 含 ggplot2library(palmerpenguins)# penguins 数据library(ggthemes)# 主题与配色df <- penguins |>select(flipper_length_mm, body_mass_g, species)|>drop_na()# 去除缺失值
library(ggplot2)ggplot(df, aes(x = flipper_length_mm, y = body_mass_g))+geom_point(aes(color = species, shape = species), alpha =0.8)+geom_smooth(method ="lm", se =FALSE)+labs(title ="Body mass and flipper length",subtitle ="Adelie, Chinstrap, Gentoo (Palmer Archipelago)",x ="Flipper length (mm)", y ="Body mass (g)",color ="Species", shape ="Species")+theme_bw(base_size =14)
散点图初步显示正相关趋势

shapiro.test(df$flipper_length_mm)shapiro.test(df$body_mass_g)
当两变量近似正态分布时使用:
pear <- cor.test(df$flipper_length_mm, df$body_mass_g, method ="pearson")pear
输出内容:
cor:相关系数 r(方向与强度)p-value:显著性水平conf.int:置信区间若数据不服从正态或为等级资料(如评分、分级):
spear <- cor.test(data$age, data$bmi, method ="spearman")spear
Warning message:In cor.test.default(...) :Cannot computeexact p-value with ties
Spearman 秩相关系数是基于**秩次(rank)计算的。当变量中存在重复值(ties)时,R 无法计算“精确 p 值”(exact p-value),于是改用近似 p 值(asymptotic p-value)。在企鹅数据集中,flipper_length_mm 或 body_mass_g 有重复测量,因此会触发该提示。
library(ggplot2)ggplot(df, aes(x = flipper_length_mm, y = body_mass_g))+geom_point(aes(color = species, shape = species), alpha =0.8)+geom_smooth(method ="lm", se =FALSE)+labs(title ="Body mass and flipper length",subtitle ="Adelie, Chinstrap, Gentoo (Palmer Archipelago)",x ="Flipper length (mm)", y ="Body mass (g)",color ="Species", shape ="Species")+theme_bw(base_size =14)+scale_color_colorblind()+annotate("text",x =min(df$flipper_length_mm)+2,y =max(df$body_mass_g),hjust =0,label = paste0("Pearson r = ",round(pear$estimate,2),", p = ",signif(pear$p.value,3)))

| Pearson | cor.test(x, y, method="pearson") | ||
| Spearman | cor.test(x, y, method="spearman") |
总结:先判断正态性 → 决定 Pearson 或 Spearman;相关显著(p<0.05)则表示两变量随同变化趋势显著。
| 基本定义 | |
| 核心目标 | |
| 通俗理解 | |
| 常见用途 | |
| 实质 | |
| 常见误区 |
回归分析的本质是:在控制混杂的前提下,用数学模型定量描述自变量与结局变量之间的关系,从而实现解释与预测。
| 线性回归(Linear Regression) | ||||||
| Logistic回归(Logistic Regression) | ||||||
| Cox比例风险回归(Cox Regression) |
ggsave()或者pdf()/png()函数进行导出tiff格式图片,文件体积大但清晰度也没好太多;pdf、png、jpg,pdf是矢量图,后两种是位图(矢量图位图的小知识[https://blog.csdn.net/xpj8888/article/details/82712238]),如果导出位图,期刊要求的dpi一般不低于300,我们一般导出dpi为600的图片;