什么是虚拟变量
虚拟变量(Dummy Variable),又称哑变量或指示变量,是统计学和计量经济学中用于将定性数据(分类变量)转换为定量数据(数值变量)的一种方法。它通过赋予不同类别特定的数值(通常是0或1),使得分类变量能够被纳入回归模型等定量分析中。
- 定性数据(Categorical Data)
定性数据表示事物的类别或属性,可分为:
名义变量(Nominal Variable):类别间无顺序关系
例:性别(男/女)、地区(东部/中部/西部)、血型(A/B/O/AB)
有序变量(Ordinal Variable):类别间有顺序关系
例:教育水平(小学/中学/大学)、满意度(不满意/一般/满意) - 定量数据:
定量数据是可直接进行数学运算的数值型变量,分为连续变量和离散变量。
连续变量:身高、体重、温度
离散变量:年龄、家庭人口数
虚拟变量的定义
虚拟变量是一种只有0和1两种取值的变量,用于表示某一类别是否存在。例如:
- 性别:男(1),女(0)
- 地区:东部(1),非东部(0)
为什么需要虚拟变量
许多统计模型只能处理数值型变量,分类变量无法直接参与计算,而在实际中,有可能收到这些因素的影响,或者我们想要研究性别、地区、行业是否对收入有影响,这个时候就需要量化,将其变为虚拟变量。通过引入虚拟变量,可以将分类信息编码为数值,使其能够被模型识别和利用。
虚拟变量的构造方法
对于有 个类别的分类变量,通常需要引入 个虚拟变量。例如:
| 地区 | ||
|---|---|---|
| 东部 | 1 | 0 |
| 中部 | 0 | 1 |
| 西部 | 0 | 0 |
其中, 表示“东部”, 表示“中部”,西部作为基准组,即当 时,表示“西部”。
虚拟变量陷阱
在回归模型中,若为 个类别引入 个虚拟变量,会导致多重共线性(虚拟变量陷阱)。这是因为如上所述,基准组可以由前个变量表示。因此,通常只需引入 个虚拟变量,剩下的类别作为基准组。
如上述例子所示,为东部,为中部,当为西部。这个时候就没有必要额外引入一个变量了。
应用举例
假设我们要分析工资与性别的关系,可以建立如下回归模型:
\begin{align} 工资 = \beta_0 + \beta_1 \times 性别 + \epsilon \end{align}$$其中,性别为虚拟变量(男=1,女=0),$\beta_1$ 表示男性与女性工资的平均差异。 或者分析工资与地区的关系,则可以建立如下模型:
\begin{align}
工资 = \beta_0 + \beta_1 D_1 + \beta_1 \times D_2+ \epsilon
\end{align}
其中,$D_1=1,D_2=0$为东部,$D_1=0,D_2=1$为中部,当$D_1=0,D_2=0$为西部。 ## 结果解读 假设以性别对工资的影响为例,设模型为: $$\begin{align} 工资 = \beta_0 + \beta_1 \times D + \epsilon \end{align}$$其中,性别为虚拟变量$D$(男=1,女=0)。 假设回归结果为
\begin{align}
工资 = 5000 + 50 \times D + \epsilon
\end{align}
那么,当性别为女的时候,虚拟变量$D=0$,则会发现,性别为女时的回归就变为了:
\begin{align}
工资 = 5000 + 50 \times 0 + \epsilon
\end{align}
而当性别为男的bian为男的时候,虚拟变量$D=1$,则会发现,性别为男时的回归就变为了:
\begin{align}
工资 = 5000 + 50 \times 1 + \epsilon
\end{align}
从上述对比中可以发现,男性的工资比女性高50个单位。而 5000 是平均工资水平。若$\beta_1=50$系数在给定的显著性水平下显著,那么我们就有理由说,性别对工资有显著影响。
### stata 实现
在这里我们还是使用 stata 自带的 auto 数据集来演示虚拟变量的使用。
导入数据集:
1
2
3
4
5
6
7
8
9
10
11
12. sysuse auto, clear
(1978 automobile data)
. tab foreign # 查看foreign变量的取值
Car origin | Freq. Percent Cum.
------------+-----------------------------------
Domestic | 52 70.27 70.27
Foreign | 22 29.73 100.00
------------+-----------------------------------
Total | 74 100.001
2
3
4
5. label list origin
origin:
0 Domestic
1 Foreign1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19. gen foreign_str = ""
(74 missing values generated)
. replace foreign_str = "Domestic" if foreign == 0
variable foreign_str was str1 now str8
(52 real changes made)
. replace foreign_str = "Foreign" if foreign == 1
(22 real changes made)
. tab foreign_str
foreign_str | Freq. Percent Cum.
------------+-----------------------------------
Domestic | 52 70.27 70.27
Foreign | 22 29.73 100.00
------------+-----------------------------------
Total | 74 100.001
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19. gen foreign_dummy = 0 # 生成新变量,并将其全部赋值为 0
. replace foreign_dummy = 1 if foreign_str == "Foreign" 将满足条件的值改为 1
(22 real changes made)
. tab foreign_dummy
foreign_dum |
my | Freq. Percent Cum.
------------+-----------------------------------
0 | 52 70.27 70.27
1 | 22 29.73 100.00
------------+-----------------------------------
Total | 74 100.00
.
end of do-file
. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18. reg price foreign_dummy # 也可以将foreign_dummy换为foreign
Source | SS df MS Number of obs = 74
-------------+---------------------------------- F(1, 72) = 0.17
Model | 1507382.66 1 1507382.66 Prob > F = 0.6802
Residual | 633558013 72 8799416.85 R-squared = 0.0024
-------------+---------------------------------- Adj R-squared = -0.0115
Total | 635065396 73 8699525.97 Root MSE = 2966.4
-------------------------------------------------------------------------------
price | Coefficient Std. err. t P>|t| [95% conf. interval]
--------------+----------------------------------------------------------------
foreign_dummy | 312.2587 754.4488 0.41 0.680 -1191.708 1816.225
_cons | 6072.423 411.363 14.76 0.000 5252.386 6892.46
-------------------------------------------------------------------------------
.
end of do-file