从多变量可视化到统计推断的直觉理解
第一次运行前,请先安装这几个扩展包。
如果你已经安装过,就不用重复安装。
今天这一讲不再重复二维图形,而是回答四个更进阶的问题:
三维图形 用来帮助我们看到多变量结构。
描述性统计 用来帮助我们概括数据的中心、离散和分布。
分布 用来帮助我们理解为什么可以做统计推断。
回归表 用来帮助我们把“看起来有关系”变成“可以被解释的关系”。
二维散点图一次只能展示两个变量。
但真实数据经常是这样的:
mpghpwt如果我们只看 mpg 和 hp,就可能忽略 wt 的作用。
所以,三维图形的价值并不只是“更炫”,而是它开始逼近真实研究中的多变量思维。
这里我们人为构造了三组数据:
x 可以理解为第一个解释变量y 可以理解为第二个解释变量z 由 x 和 y 共同决定这样做的好处是,图形的结构会比较清晰,学生更容易看出三维关系。
看到这张图时,学生至少要抓住三件事:
如果点大体贴近某个平面,通常意味着:
第三个变量可以由前两个变量较好地解释。
这就是回归模型最直观的几何直觉。
二维散点图只能问:
x和y有没有关系?
三维散点图开始能问:
z会不会同时受到x和y的影响?
因此,三维图其实在做一件非常重要的事:
把“两个变量的相关”推进到“多个变量的联合关系”。
这一页最容易产生一个误区:
3D 饼图看起来更复杂,所以信息更多。
其实不是。
饼图无论是否 3D,本质都在回答同一个问题:
所以这页最重要的话不是“它很高级”,而是:
3D 在这里主要是视觉效果,核心信息仍然是比例结构。
| 图形 | 最适合回答的问题 | 核心单位 |
|---|---|---|
| 3D散点图 | 多个连续变量之间是否有结构关系 | 点 |
| 3D柱状图 | 两个类别维度下的数值差异 | 柱体 |
| 3D饼图 | 各部分占整体的比例 | 扇区 |
这一页的目的,是帮助学生形成“图形和任务匹配”的意识。
三维图能帮助我们形成直觉,但它们并不完美。
局限主要有三点:
这就引出下一步:
我们需要用统计量把图形观察变成更精确的描述。
summary() 开始summary() 这一页到底要讲什么summary() 最适合做“第一次看数据”。
它给出的信息虽然不算特别多,但非常关键:
Min.:最小值1st Qu.:第一四分位数Median:中位数Mean:均值3rd Qu.:第三四分位数Max.:最大值它帮助我们快速回答:
这个变量大致处在什么水平?
它的分布是集中还是分散?
它有没有特别大的极端值?
summary():以 mpg 为例当你看到 mpg 的 summary 输出时,可以这样解释:
Mean 告诉我们样本的平均油耗水平。Median 告诉我们中间位置的典型水平。Mean 和 Median 差得比较多,往往意味着分布可能不对称。Min 和 Max 告诉我们数据范围。这一步其实是在训练学生建立三个基本维度:
中心位置、离散程度、分布形状。
sapply():为什么它很实用如果变量很多,一个个写 mean()、sd() 会很慢。
sapply() 的作用就是:
对一个变量列表,重复做同一件事。
它不是新的统计学概念,而是一个“批量执行工具”。
sapply():一次性算多个均值和标准差sapply() 这一页应该怎么讲这一页要让学生理解两层意思:
第一层,操作层面:
第二层,统计层面:
mean 反映平均水平sd 反映波动程度这正好对应描述性统计中的两个最基本问题:
数据大概在什么位置?
数据围绕这个位置波动得厉不厉害?
到这里,学生已经知道:
但统计学不会停在这里。
因为接下来我们会问:
这些统计量为什么有意义?
为什么我们可以根据样本去推断总体?
答案就和“分布”有关。
正态分布最核心的两个参数是:
mu:均值,决定曲线中心在哪里sigma:标准差,决定曲线是“高而窄”还是“矮而宽”所以正态分布可以理解为:
一个以均值为中心、由标准差控制离散程度的对称分布。
这三点非常重要,因为它们帮助学生建立一个直觉:
真实世界中的很多误差项和很多平均后的统计量,都会“近似地”呈现这种形状。
在正态分布里:
这条经验法则的意义在于:
标准差不只是“一个数字”,它对应了数据围绕中心的典型波动范围。
因为学生很容易误以为:
所有变量都差不多是钟形曲线。
其实不是。
右偏分布常见于:
这些变量经常表现为:
这时往往会出现:
mean > median
这是这部分最重要的一页。
我们后面要讲:
t 值p 值这些概念之所以能成立,不是凭空来的,而是因为统计推断依赖一个前提:
很多估计量在大样本下会近似服从正态分布,或者至少可以用对称分布来逼近。
所以“分布”不是装饰,而是推断的基础。
table()table() 这一页要怎么讲table() 的任务非常单纯:
统计每个类别出现了多少次。
这一步虽然简单,但很重要,因为只要变量是分类变量,第一件事往往就是先数频数。
例如这里:
prop.table()因为单看频数,有时不够直观。
比例能更直接回答:
所以可以给学生强调一句:
table()是“数量”,prop.table()是“结构”。
xtabs()xtabs() 应该怎么解释这一页是分类变量分析的进阶。
它不再只是看一个变量,而是在问:
两个分类变量之间有没有结构关系?
这里的例子是:
所以 xtabs() 的本质就是:
把两个分类变量交叉起来,看看每个组合里有多少观测值。
如果一个列联表里不同类别组合非常不均匀,往往说明:
虽然今天这节课不展开卡方检验,但你可以让学生先形成直觉:
结构上的不均匀,本身就提示了变量之间可能有关系。
到这里为止,我们已经做了三件事:
接下来,我们要把这些内容合到一起,进入最常见的统计表:
回归表
Call:
lm(formula = mpg ~ hp + wt, data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-3.941 -1.600 -0.182 1.050 5.854
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.22727 1.59879 23.285 < 2e-16 ***
hp -0.03177 0.00903 -3.519 0.00145 **
wt -3.87783 0.63273 -6.129 1.12e-06 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.593 on 29 degrees of freedom
Multiple R-squared: 0.8268, Adjusted R-squared: 0.8148
F-statistic: 69.21 on 2 and 29 DF, p-value: 9.109e-12
summary(model) 的输出很多,第一次看往往会乱。
所以要教学生一个顺序:
R^2换句话说,不能“每个数字都平等地看”。
reg_mat <- summary(model)$coefficients
reg_tab <- data.frame(
Variable = rownames(reg_mat),
Estimate = round(reg_mat[, 1], 3),
Std_Error = round(reg_mat[, 2], 3),
t_value = round(reg_mat[, 3], 3),
p_value = round(reg_mat[, 4], 4),
row.names = NULL
)
reg_tab Variable Estimate Std_Error t_value p_value
1 (Intercept) 37.227 1.599 23.285 0.0000
2 hp -0.032 0.009 -3.519 0.0015
3 wt -3.878 0.633 -6.129 0.0000
系数的任务是回答:
当这个变量增加 1 个单位时,结果变量平均会变化多少?
例如,如果 wt 的系数是负的,就说明:
mpg 越低所以系数同时给出两类信息:
标准误不是“另一个系数”,它反映的是:
这个系数估计得稳不稳。
如果标准误很大,说明:
回归输出里的 t value 本质上就是:
\[ t = \frac{\hat{\beta}}{SE(\hat{\beta})} \]
可以把它理解为:
系数相对于自身噪音有多大。
如果绝对值比较大,通常意味着这个结果不像是纯随机波动造成的。
p value 经常让初学者最紧张,但其实你可以把它讲得很直白:
如果这个变量实际上没有作用,那么像现在这样极端的结果出现的概率有多大?
因此:
p 很小:更不容易是随机巧合p 较大:我们就不能很有把握地说它有作用课堂上完全没必要把假设检验的全过程都展开,但一定要讲清:
p 值不是“作用大小”,而是“证据强度”。
R^2:整体解释力R^2 的问题不是“单个变量怎么样”,而是:
整个模型对结果变量解释得怎么样?
例如,R^2 = 0.75 可以理解为:
它告诉我们模型整体拟合得好不好,但它不能代替对单个变量系数的解释。
假设我们看到这样一行:
wt = -3.878Std.Error = 0.633t = -6.129p < 0.001标准读法应该是:
在控制马力之后,车重对油耗具有显著负向影响。车重每增加 1 个单位,油耗指标
mpg平均下降约 3.878 个单位,而且这个结果具有很强的统计证据。
这一句非常重要,因为它把:
三个层面合在了一起。
如果你把来龙去脉都压缩进一张论文表,最建议学生按这个顺序阅读:
R^2 和样本量 N不要一上来盯着星号,也不要只看 R^2。
第一,认为“显著”就等于“影响很大”。
第二,认为 R^2 高就说明模型一定正确。
R^2 只是拟合度,不代表因果识别完全没问题。第三,认为系数就是因果关系。
#回归表
# 如果没安装,先取消注释运行一次
# install.packages("stargazer")
library(stargazer)
# 使用内置数据
data(mtcars)
# 建立两个模型(方便讲“控制变量”)
model1 <- lm(mpg ~ hp, data = mtcars)
model2 <- lm(mpg ~ hp + wt, data = mtcars)
# 输出回归表(HTML格式适合PPT)
stargazer(model1, model2,
type = "html",
title = "Regression Results",
dep.var.labels = "Miles per Gallon (mpg)",
covariate.labels = c("Horsepower", "Weight"),
digits = 3,
star.cutoffs = c(0.1, 0.05, 0.01),
align = TRUE)| Dependent variable: | ||
| Miles per Gallon (mpg) | ||
| (1) | (2) | |
| Horsepower | -0.068*** | -0.032*** |
| (0.010) | (0.009) | |
| Weight | -3.878*** | |
| (0.633) | ||
| Constant | 30.099*** | 37.227*** |
| (1.634) | (1.599) | |
| Observations | 32 | 32 |
| R2 | 0.602 | 0.827 |
| Adjusted R2 | 0.589 | 0.815 |
| Residual Std. Error | 3.863 (df = 30) | 2.593 (df = 29) |
| F Statistic | 45.460*** (df = 1; 30) | 69.211*** (df = 2; 29) |
| Note: | p<0.1; p<0.05; p<0.01 | |
👉 标准表达:
马力和车重对油耗都有显著负向影响,
在加入车重后,模型解释力显著提升(R²从0.60到0.83),
同时马力的影响减弱,说明车重是一个重要的控制变量。
回归表回答的是:
现在回头看,我们今天做的其实是同一件事的四个层次:
所以它们不是分散的知识点,而是一条连续的学习路径。
今天最重要的收获可以概括成三句话:
summary()、sapply()、table() 和 xtabs() 是最实用的入口。你们现在最应该尝试做的一件事,不是背定义,而是练习把一张回归表“翻译成一句完整的人话”。