# Stata：正态转换的五种方法

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

New！ `lianxh` 命令发布了：

`. ssc install lianxh`

`. help lianxh`

⛳ Stata 系列推文：

## 2. 判断指标：偏度（Skewness）和峰度（Kurtosis）

### 2.1 方法一：计算统计量

``````. sysuse nlsw88, clear
. tabstat wage, stat (count mean p50 skewness kurtosis)

Variable |    N      Mean      p50  Skewness  Kurtosis
----------+---------------------------------------------
wage | 2246  7.766949  6.27227  3.096199  15.85446
--------------------------------------------------------
``````

### 2.2 方法二：图示法

``````. sysuse nlsw88,clear
. sum wage, d
. local p50  = r(p50)
. local mean = r(mean)
. twoway (hist wage, vertical color("136 187 203")                      ///
>     xline(`mean', lcolor("220 146 20")) xline(`p50', lcolor(black)))  ///
>     (kdensity wage, lpattern(dash)),                                  ///
>     ylabel(0(0.035)0.14) graphregion(color(white))                    ///
>     xtitle(Wage,place(right)) ytitle(Density, place(top))             ///
>     legend(ring(0) col(1) position(2.5))
. gr save wage0.gph, replace
``````

### 2.2 方法三：外部命令

``````. ssc install jb6, replace
. sysuse nlsw88, clear
. jb6 wage
Jarque-Bera normality test:  1.9e+04 Chi(2)      0
Jarque-Bera test for Ho: normality: (wage)
``````

## 3. 数据转换方案

### 3.1 对数转换 (Log Transformation)

``````. sysuse nlsw88,clear
. gen Logwage=log(wage)
. twoway (hist wage, vertical color("136 187 203"))        ///
>     (kdensity wage, lpattern(dash)),                     ///
>     ylabel(0(0.035)0.14) graphregion(color(white))       ///
>     xtitle(Wage,place(right)) ytitle(Density,place(top)) ///
>     legend(ring(0) col(1) position(1))
. gr save wage.gph, replace

. twoway (hist Logwage,vertical color("96 133 149"))          ///
>     (kdensity Logwage, lpattern(dash)),                     ///
>     graphregion(color(white))                               ///
>     xtitle(Logwage,place(right)) ytitle(Density,place(top)) ///
>     legend(ring(0) col(1) position(1))
. gr save Logwage.gph, replace
. gr combine wage.gph Logwage.gph, ysize(3)
``````

### 3.2 平方根转换 (Square-Root Transformation)

``````. sysuse nlsw88,clear
. gen Sqrtwage = sqrt(wage)
. twoway (hist wage, vertical color("136 187 203"))        ///
>     (kdensity wage, lpattern(dash)),                     ///
>     ylabel(0(0.035)0.14) graphregion(color(white))       ///
>     xtitle(Wage,place(right)) ytitle(Density,place(top)) ///
>     legend(ring(0) col(1) position(1))
. gr save wage.gph, replace
. twoway (hist Sqrtwage, vertical color("96 133 149"))         ///
>     (kdensity Sqrtwage, lpattern(dash)),                     ///
>     graphregion(color(white))                                ///
>     xtitle(Sqrtwage,place(right)) ytitle(Density,place(top)) ///
>     legend(ring(0) col(1) position(1))
. gr save Sqrtwage.gph, replace
. gr combine wage.gph Sqrtwage.gph, ysize(3)
``````

### 3.3 倒数转换 (Reciprocal Transformation)

``````. sysuse nlsw88,clear
. gen Reciwage=1/wage
. twoway (hist wage, vertical color("136 187 203"))         ///
>     (kdensity wage, lpattern(dash)),                      ///
>     ylabel(0(0.035)0.14) graphregion(color(white))        ///
>     xtitle(Wage,place(right)) ytitle(Density,place(top))  ///
>     legend(ring(0) col(1) position(1))
. gr save wage.gph, replace
. twoway (hist Reciwage, vertical color("96 133 149"))         ///
>     (kdensity Reciwage, lpattern(dash)),                     ///
>     graphregion(color(white))                                ///
>     xtitle(Reciwage,place(right)) ytitle(Density,place(top)) ///
>     legend(ring(0) col(1) position(1))
. gr save Reciwage.gph, replace
. gr combine wage.gph Reciwage.gph, ysize(3)
``````

### 3.4 伯克斯-考克斯转换 (Box-Cox Transformation)

Box-Cox 变换是一种广义幂变换方法，可以明显地改善数据的正态性和方差齐性，其计算公式为：

• $\theta =0$ 时相当于对数变换；
• $\theta =2$ 时等同于平方变换；
• $\theta =1$ 时相当于没有进行变换；
• $\theta =\frac{1}{2}$ 时相当于平方根变换；
• $\theta =-1$ 时等同于倒数变换。

``````boxcox depvar [indepvars] [if] [in] [weight] [, options]
``````

`depvar``indepvars`：被解释变量和解释变量。`options` 选择项如下：

• `model(lhsonly)`：指定只对因变量进行 Box-Cox 变换，而不对自变量进行变换。这种情况下，Box-Cox 转换的指数 $\theta$ 是仅基于被解释变量 $Y$ 的最大似然估计 (MLE) 得到的。使用此选项可以在保持解释变量不变的情况下对被解释变量进行变换。
• `model(rhsonly)`：指定只对解释变量进行 Box-Cox 变换，而不对被解释变量进行变换。这种情况下，Box-Cox 转换的指数 $\theta$ 是仅基于自变量 $x$ 的最大似然估计 (MLE) 得到的。使用此选项可以在保持被解释变量不变的情况下对解释变量进行变换。
• `model(lambda)`：指定 Box-Cox 转换的指数 $\theta$ 是通过基于被解释变量和解释变量的联合最大似然估计 (MLE) 得到的。这是 `boxcox` 命令的默认选项，它同时对因变量和自变量进行 Box-Cox 变换。
• `model(theta)`：指定 Box-Cox 转换的指数 $\theta$ 是通过估计数据的 Mills 比例，基于被解释变量和解释变量的联合最大似然估计 (MLE) 得到的。
• `notrans`：指定不对数据进行任何变换，仅计算出基于因变量和自变量的联合最大似然估计 (MLE) 得到的 Box-Cox 变换的指数 $\theta$。使用此选项可以仅获得指数而不进行实际的变换。

``````. sysuse nlsw88, clear
. boxcox wage, model(lhsonly)

Number of obs =  2,246
LR chi2(0)    =   0.00
Log likelihood = -6108.0084            Prob > chi2   =      .
----------------------------------------------------------------
wage | Coefficient Std. err.     z   P>|z|  [95% conf. interval]
-----+-----------------------------------------------------------
/theta| -.2241236  .0288636   -7.76  0.000  -.2806952    -.167552
-----------------------------------------------------------------

Estimates of scale-variant parameters
----------------------------
| Coefficient
-------------+--------------
Notrans      |
_cons |   1.502707
-------------+--------------
/sigma |   .3727356
----------------------------

-----------------------------------------------------
Test       Restricted    LR statistic
H0:     log likelihood      chi2      Prob > chi2
-----------------------------------------------------
theta = -1    -6449.0767      682.14          0.000
theta =  0     -6138.868       61.72          0.000
theta =  1    -7117.2949     2018.57          0.000
-----------------------------------------------------
``````

``````. sysuse nlsw88, clear
. gen Boxwage=(wage^(-0.2241)-1)/(-0.2241)
. twoway (hist wage, vertical color("136 187 203"))        ///
>     (kdensity wage, lpattern(dash)),                     ///
>     ylabel(0(0.035)0.14) graphregion(color(white))       ///
>     xtitle(Wage,place(right)) ytitle(Density,place(top)) ///
>     legend(ring(0) col(1) position(1))
. gr save wage.gph, replace
. twoway (hist Boxwage, vertical color("96 133 149"))         ///
>     (kdensity Boxwage, lpattern(dash)),                     ///
>     graphregion(color(white))                               ///
>     xtitle(Boxwage,place(right)) ytitle(Density,place(top)) ///
>     legend(ring(0) col(1) position(10))
. gr save Boxwage.gph, replace
. gr combine wage.gph Boxwage.gph, ysize(3)

``````

### 3.5 杨-约翰逊转换 (Yeo-Johnson Transformation)

Yeo-Johnson 转换也是一种广义幂变换方法，通过构建一组单调函数对随机变量进行数据变换，其特点在于其可被应用于包含 0 值和负值的样本中，因此其也被认为是 Box-Cox 变换在实数域的推广。当随机变量非负时，其表达式为：

``````. sysuse nlsw88, clear
. python
---- python (type end to exit) ---
>>> from sfi import Data
>>> from scipy.stats import yeojohnson
>>> Wage=Data.get(va = 'wage')
>>> YJwage,lam = yeojohnson(Wage)
>>> print(YJwage,lam)
>>> Data.store("YJwage",None,val=YJwage)
>>> end
-----------------------------------
. twoway (hist wage, vertical color("136 187 203"))        ///
>     (kdensity wage, lpattern(dash)),                     ///
>     ylabel(0(0.035)0.14) graphregion(color(white))       ///
>     xtitle(Wage,place(right)) ytitle(Density,place(top)) ///
>     legend(ring(0) col(1) position(1))
. gr save wage.gph, replace
. twoway (hist YJwage, vertical color("96 133 149"))         ///
>     (kdensity YJwage, lpattern(dash)),                     ///
>     graphregion(color(white))                              ///
>     xtitle(YJwage,place(right)) ytitle(Density,place(top)) ///
>     legend(ring(0) col(1) position(10))
. gr save YJwage.gph, replace
. gr combine wage.gph YJwage.gph, ysize(3)
``````

## 4. 总结

• 通过偏度 (Skewness) 和峰度 (Kurtosis) 判断数据是否接近正态分布以及是否需要进行进行正态转化。
• 进行判断方法有计算统计量、图示法以及使用外部命令等。
• 能够较好地进行正态转化的方法有对数转换、Box-Cox 转换以及 Yeo-Johnso 转换，并且对数转化是后两者的一种特例。
• 平方根转换能够对数据进行正态转化但效果不十分明显，倒数转化的作用十分有限。

## 5. 参考资料

• Tamil Selvan S，博客，Types Of Transformations For Better Normal Distribution
• Yeo, I.K. and Johnson, R.A., 2000. A new family of power transformations to improve normality or symmetry. Biometrika, 87(4), pp.954-959. -PDF- , -Link-
• Box, G.E. and Cox, D.R., 1964. An analysis of transformations. Journal of the Royal Statistical Society: Series B (Methodological), 26(2), pp.211-243. -PDF- , -Link-
• Joanes, D.N. and Gill, C.A., 1998. Comparing measures of sample skewness and kurtosis. The Statistician, 47, pp.183–189. -PDF- , -Link-

## 6. 相关推文

Note：产生如下推文列表的 Stata 命令为：
`lianxh 对数 python交互, m`

`ssc install lianxh, replace`

## 相关课程

### 最新课程-直播课

• Note: 部分课程的资料，PPT 等可以前往 连享会-直播课 主页查看，下载。

### 关于我们

• Stata连享会 由中山大学连玉君老师团队创办，定期分享实证分析经验。
• 连享会-主页知乎专栏，700+ 推文，实证分析不再抓狂。直播间 有很多视频课程，可以随时观看。
• 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标，输入简要关键词，以便快速呈现历史推文，获取工具软件和数据下载。常见关键词：`课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法`

✏ 连享会-常见问题解答：
https://gitee.com/lianxh/Course/wikis

New！ `lianxh``songbl` 命令发布了：

`. ssc install lianxh`

`. help lianxh`