简介:这份PDF面向备考统计类考试、需要掌握多元线性回归实操的读者,以SPSS软件为工具,通过完整操作截图演示从数据输入到结果解释的全流程。资源包内含1个PDF文件,大小约7.91MB,内容以图文截图为主,直观呈现SPSS界面与关键参数设置。截图实例围绕雇员当前工资预测展开,涵盖性别、受教育程度、职务分类、起始工资、受雇月数、过去经验等自变量,逐步展示数据预处理、模型建立、回归系数与t值、p值等结果的读取方式,并说明如何解释各自变量对因变量的影响。目前已有542人学习下载,适合希望用一份可视化案例快速理解多元线性回归分析步骤、对照练习SPSS操作的学习者参考。
1. 从一份雇员薪酬数据说起:多元线性回归在 SPSS 里到底怎么跑
手里这份《多元线性回归实例软件SPSS操作截图.pdf》其实是一份很典型的课堂数据集:雇员编号、性别、生日、受教育程度、职务分类、当前工资、起始工资、受雇月数、过去经验、是否少数民族,一共十来个字段,样本量不大,字段名还带着 id、gender、bdate、educ、jobcat、salary、salbegin、jobtime、prevexp、minority、age 这套 SPSS 经典命名。很多人第一次做多元线性回归,卡的不是公式,而是拿到这样一张表之后不知道从哪一列点起。这份资料的价值就在于它把 SPSS 的操作界面一步步截了下来,从数据录入到模型输出都有痕迹可循。它适合两类人:一类是统计课要交作业、需要照着截图复现结果的学生;另一类是想用 SPSS 快速验证「受教育程度、起始工资、工作年限到底谁在影响当前工资」这类问题的从业者。下面不按截图顺序念,而是按一个能真正跑通的流程拆开讲。
2. 数据准备与变量角色划分:SPSS 里的 salary 因变量怎么定
2.1 先分清因变量和自变量
多元线性回归的核心是找一个因变量(dependent)和一组自变量(independent)。在这份数据里,最自然的因变量是salary(当前工资),自变量候选包括educ(受教育程度,单位年)、salbegin(起始工资)、jobtime(受雇月数)、prevexp(过去经验月数)、age(年龄)、gender(性别)、jobcat(职务分类)、minority(是否少数民族)。
这里有个容易踩的坑:salary和salbegin高度相关,因为起始工资本身就是当前工资的强预测项。如果两个都放进去,回归系数虽然能算,但解释时要小心多重共线性。常见做法是先跑一个包含全部候选变量的模型,再看 VIF 和显著性决定删谁。
| 变量名 | 含义 | 角色 | 测量尺度 |
|---|---|---|---|
| salary | 当前工资 | 因变量 | 连续 |
| educ | 受教育程度(年) | 自变量 | 连续 |
| salbegin | 起始工资 | 自变量 | 连续 |
| jobtime | 受雇月数 | 自变量 | 连续 |
| prevexp | 过去经验(月) | 自变量 | 连续 |
| gender | 性别 | 自变量 | 分类(0/1) |
| jobcat | 职务分类 | 自变量 | 分类(多水平) |
| minority | 是否少数民族 | 自变量 | 分类(0/1) |
2.2 把数据录进 SPSS 的两种方式
第一种是直接在 SPSS 的「变量视图」里定义变量,再切到「数据视图」逐行录入。变量视图里要设好 Name、Type、Width、Decimals、Label、Values、Measure。比如gender的 Values 设成 0=f、1=m,minority设成 0=no、1=yes,Measure 里分类变量选 Nominal,连续变量选 Scale。
第二种是从 Excel 或 CSV 导入,路径是文件 → 打开 → 数据,文件类型选 Excel,勾选「从第一行读取变量名」。导入后务必回变量视图检查 Measure 有没有被自动识别错,SPSS 经常把 0/1 编码的性别识别成 Scale,这会影响后面某些分析。
# 如果数据在 CSV 里,也可以先用 Python 快速看一眼字段和缺失情况 python -c " import pandas as pd df = pd.read_csv('employee.csv') print(df.dtypes) print(df.isnull().sum()) print(df[['salary','educ','salbegin','jobtime','prevexp']].describe()) "这段代码做三件事:打印字段类型、统计每列缺失值、对连续变量做描述统计。dtypes能看出哪些列被读成了 object(通常是分类变量),isnull().sum()定位缺失,describe()给出均值、标准差、最小最大值,方便判断有没有离谱的异常值,比如工资出现负数或年龄超过 100。
2.3 缺失值和异常值处理
SPSS 里查缺失用分析 → 描述统计 → 频率,勾选「显示缺失值」。如果缺失比例低于 5%,常见做法是整行删除(成列删除);如果某个变量缺失较多,可以考虑均值替换或回归插补,但要在报告里说明。异常值用箱线图看,图形 → 旧对话框 → 箱图,把 salary 拖进去,超出 1.5 倍四分位距的点会被标出来。注意不要一看到异常值就删,先判断是不是录入错误。
3. 在 SPSS 里建立多元回归模型:从线性回归对话框到系数表
3.1 操作路径与变量摆放
SPSS 的多元线性回归入口是分析 → 回归 → 线性。打开对话框后,把salary放进「因变量」框,把educ、salbegin、jobtime、prevexp、age放进「自变量」框。分类变量gender、jobcat、minority如果直接放进去,SPSS 会当成连续变量处理,这是新手最常犯的错。
正确做法是点「分类」按钮,把gender、jobcat、minority移进「分类协变量」列表,然后选择「指示符」对比,参考类别选「最后一个」。这样 SPSS 会自动生成哑变量,比如 jobcat 有三个水平,就会生成两个哑变量。
3.2 方法选择:进入、逐步、后退
对话框里的「方法」下拉框决定变量怎么进模型:
- 进入(Enter):所有自变量一次性全部进入,适合理论驱动、你已经确定要放哪些变量。
- 逐步(Stepwise):按统计显著性逐步加入或剔除,适合探索性分析,但结果不稳定,样本小的时候尤其容易过拟合。
- 后退(Backward):先全放进去,再逐步剔除不显著的。
这份雇员数据样本不大,我一般先用「进入」跑全模型,看哪些变量显著,再用「后退」验证一遍,两次结果一致的变量才敢下结论。
3.3 勾选统计量和图
点「统计」按钮,至少勾选:估计值、模型拟合度、R 方变化、描述性统计、共线性诊断、Durbin-Watson。共线性诊断会输出 VIF 和容忍度,Durbin-Watson 看残差自相关。点「图」按钮,把ZPRED放 X 轴、ZRESID放 Y 轴,生成残差散点图,用来检查线性假设和方差齐性。
# 用 statsmodels 对照 SPSS 的结果,验证系数是否一致 import pandas as pd import statsmodels.api as sm df = pd.read_csv('employee.csv') X = df[['educ', 'salbegin', 'jobtime', 'prevexp', 'age']] X = sm.add_constant(X) # 加截距项 y = df['salary'] model = sm.OLS(y, X).fit() print(model.summary()) print('VIF:', [sm.stats.outliers_influence.variance_inflation_factor(X.values, i) for i in range(X.shape[1])])这段代码用 statsmodels 复现 SPSS 的 OLS 结果。add_constant补上截距,model.summary()输出系数、标准误、t 值、p 值、R 方,和 SPSS 的「系数」表一一对应。VIF 那行逐个计算方差膨胀因子,一般 VIF 大于 10 就说明该变量和其他自变量共线性严重,考虑剔除或合并。
3.4 读懂输出表
SPSS 输出里重点看三张表:
- 模型摘要:看 R 方和调整 R 方。调整 R 方考虑了自变量个数,比 R 方更保守,样本小的时候优先看它。
- ANOVA:看 F 值和显著性。如果 Sig. 小于 0.05,说明模型整体显著,至少有一个自变量对因变量有解释力。
- 系数:看每个自变量的 B(非标准化系数)、Beta(标准化系数)、t 值、Sig.、VIF。B 表示自变量每变化一个单位,因变量平均变化多少;Beta 去掉量纲,方便比较哪个变量影响更大。
提示:如果某个分类变量的 Sig. 大于 0.05,不要急着删,先看它的各个哑变量是否有一个显著。分类变量整体检验和单个哑变量检验是两回事。
4. 模型诊断与常见报错:共线性、异方差和哑变量陷阱
4.1 共线性诊断
共线性最直接的信号是 VIF 偏高、容忍度接近 0,同时模型整体 F 显著但单个系数都不显著。在这份数据里,salary和salbegin的相关系数通常很高,如果两个都放进去,VIF 很容易超过 10。处理办法有三种:删掉其中一个、用主成分回归、或者做岭回归。SPSS 本身没有内置岭回归菜单,需要装 R 或 Python 扩展,或者用「语法」调用。
-- 如果数据在数据库里,先算一下自变量之间的相关系数矩阵 SELECT CORR(educ, salbegin) AS r_educ_salbegin, CORR(educ, jobtime) AS r_educ_jobtime, CORR(salbegin, jobtime) AS r_salbegin_jobtime FROM employee;这段 SQL 用CORR函数算自变量两两相关系数。相关系数绝对值超过 0.8 就要警惕共线性。不同数据库函数名可能不同,MySQL 没有内置 CORR,需要用(AVG(x*y)-AVG(x)*AVG(y))/(STDDEV(x)*STDDEV(y))手动算。
4.2 异方差与残差图
残差散点图如果呈现喇叭形(随着预测值增大,残差散布变大),说明存在异方差。SPSS 里可以在「图」对话框把ZRESID放 Y 轴、ZPRED放 X 轴,看点的分布是否均匀。异方差的后果是标准误被低估,t 值虚高,容易把不显著的变量判成显著。补救办法包括对因变量取对数、用加权最小二乘,或者用稳健标准误。
4.3 哑变量陷阱
分类变量进回归必须转成哑变量,而且不能同时放入全部水平,否则会和截距项完全共线,SPSS 会直接报错或自动删掉一个。比如 jobcat 有三个水平,只能放两个哑变量,第三个作为参考类别。SPSS 的「分类」按钮会自动处理这件事,但如果你手动在数据视图里生成哑变量,就要自己保证不重复。
4.4 常见报错对照
| 报错/现象 | 可能原因 | 处理方式 |
|---|---|---|
| 系数表出现缺失行 | 某变量与截距完全共线 | 检查哑变量是否放全 |
| VIF 显示为空白 | 该变量是分类协变量 | 正常,SPSS 对分类变量不输出 VIF |
| R 方很高但系数都不显著 | 严重共线性 | 删变量或做岭回归 |
| Durbin-Watson 远离 2 | 残差自相关 | 检查数据是否按时间排序 |
| 样本量小于自变量个数 | 自由度不足 | 减少自变量或增加样本 |
5. 从系数到结论:把 SPSS 输出翻译成业务语言
5.1 标准化系数比较影响力
SPSS 系数表里的 Beta 列是标准化系数,去掉了单位影响。如果salbegin的 Beta 是 0.8,educ的 Beta 是 0.2,说明起始工资对当前工资的影响远大于受教育程度。但要注意,Beta 只在当前模型内可比,换一批变量结果会变。
5.2 写出回归方程
非标准化系数 B 直接用来写方程。假设输出是:常数项 5000,educ 的 B 为 800,salbegin 的 B 为 0.6,jobtime 的 B 为 50,那么方程是:
salary = 5000 + 800*educ + 0.6*salbegin + 50*jobtime解释时要说「在其他变量不变的情况下,受教育程度每增加一年,当前工资平均增加 800」。这个「其他变量不变」是回归系数解释的关键,漏掉就会变成因果断言。
5.3 用 Python 做预测验证
# 用训练好的模型对新员工做工资预测 import pandas as pd import statsmodels.api as sm df = pd.read_csv('employee.csv') X = sm.add_constant(df[['educ', 'salbegin', 'jobtime']]) y = df['salary'] model = sm.OLS(y, X).fit() new_emp = pd.DataFrame({'const': [1], 'educ': [16], 'salbegin': [20000], 'jobtime': [24]}) pred = model.predict(new_emp) print(f'预测当前工资: {pred.values[0]:.2f}') print(f'95% 预测区间: {model.get_prediction(new_emp).conf_int().values}')这段代码先拟合模型,再构造一条新员工记录做预测。get_prediction().conf_int()给出置信区间,比单点预测更有参考价值。注意新数据的列顺序和列名必须和训练时一致,否则predict会报错。
5.4 结果汇报的写法
一份合格的回归结果汇报至少包含:样本量、因变量、自变量列表、R 方和调整 R 方、F 检验结果、每个自变量的 B 和 Sig.、共线性诊断结论。如果用了逐步回归,还要说明进入和剔除的标准。SPSS 的「表」可以直接复制到 Word,但建议重新排版,把不显著的变量标注出来。
注意:SPSS 试用版(pdfFactory Pro 创建的那份 PDF 就是试用版输出)在导出时会带水印,正式报告里最好用截图或重新制表,避免水印影响可读性。
6. 进阶技巧:用 SPSS 语法批量跑回归和 Bootstrap 中介
6.1 语法窗口比菜单更快
SPSS 的菜单操作每次都要点一遍,变量多了很累。用「文件 → 新建 → 语法」打开语法窗口,可以直接写:
REGRESSION /DESCRIPTIVES MEAN STDDEV CORR SIG N /MISSING LISTWISE /STATISTICS COEFF OUTS R ANOVA COLLIN TOL /CRITERIA=PIN(.05) POUT(.10) /NOORIGIN /DEPENDENT salary /METHOD=ENTER educ salbegin jobtime prevexp /METHOD=STEPWISE age gender minority.这段语法先跑「进入」法放四个连续变量,再跑「逐步」法放三个分类变量。/STATISTICS里的COLLIN TOL打开共线性诊断,/CRITERIA设进入和剔除的显著性水平。把这段存成.sps文件,换数据时只改变量名就能复用。
6.2 Bootstrap 中介分析
热搜里常有人问「spss怎么做bootstrap中介分析」。SPSS 本身没有独立的中介菜单,常见做法是装 PROCESS 宏(由 Hayes 开发)。安装后走分析 → 回归 → PROCESS,模型编号选 4(简单中介),把自变量、中介变量、因变量分别放好,勾选「Bootstrap confidence intervals」,样本数设 5000,置信水平 95%。输出里看间接效应的 Bootstrap 置信区间是否包含 0,不包含就说明中介效应显著。
6.3 用 Python 复现 Bootstrap 中介
import numpy as np import pandas as pd import statsmodels.api as sm df = pd.read_csv('employee.csv') n_boot = 5000 indirect_effects = [] for _ in range(n_boot): sample = df.sample(n=len(df), replace=True) # 路径 a:自变量 -> 中介变量 a = sm.OLS(sample['salbegin'], sm.add_constant(sample[['educ']])).fit().params['educ'] # 路径 b 和 c':自变量 + 中介变量 -> 因变量 m = sm.OLS(sample['salary'], sm.add_constant(sample[['educ', 'salbegin']])).fit() b = m.params['salbegin'] indirect_effects.append(a * b) ci_low, ci_high = np.percentile(indirect_effects, [2.5, 97.5]) print(f'间接效应均值: {np.mean(indirect_effects):.2f}') print(f'95% Bootstrap 置信区间: [{ci_low:.2f}, {ci_high:.2f}]')这段代码手动实现 Bootstrap 中介检验。每次有放回抽样,先算 educ 对 salbegin 的系数 a,再算控制 educ 后 salbegin 对 salary 的系数 b,乘积 a*b 就是间接效应。重复 5000 次后取 2.5% 和 97.5% 分位数,区间不含 0 即中介显著。和 PROCESS 宏的结果应该接近,差异来自随机种子和抽样次数。
6.4 批量跑多个因变量
如果要对 salary、salbegin 分别建模型,可以用 SPSS 的SPLIT FILE或者 Python 循环:
targets = ['salary', 'salbegin'] for target in targets: X = sm.add_constant(df[['educ', 'jobtime', 'prevexp']]) model = sm.OLS(df[target], X).fit() print(f'--- 因变量: {target} ---') print(f'调整 R 方: {model.rsquared_adj:.3f}') print(model.params.round(2))循环里每次换因变量,自变量保持不变,输出调整 R 方和系数。这样能在几秒内比较不同因变量的模型表现,比在 SPSS 里反复点菜单快得多。注意每次都要重新add_constant,因为 X 会被 statsmodels 内部修改。
本文还有配套的精品资源,点击获取