Stata基本操作

Stata是什么?

根据Stata对自己的介绍:

  1. Stata is a statistical package for managing, analyzing, and graphing data.
  2. Stata is available for a variety of platforms. Stata may be used either as a point-and-click application or as a command-driven package.
  3. Stata’s GUI provides an easy interface for those new to Stata and for experienced Stata users who
    wish to execute a command that they seldom use.
  4. The command language provides a fast way to communicate with Stata and to communicate more complex ideas.

也就是Stata是一个集数据管理、分析和可视化的工具。可以在各种操作系统中使用,可以通过鼠标点击操作也能通过命令行驱动。

Stata的图形用户界面让新手们很方便入门,Stata的命令语言是的很多复杂的想法变得容易实现。

我经常看到很多R、Python、Matlab用户对Stata非常不屑一顾。每每提及Stata总是要加一句:

“如果Stata也算编程语言的话······”

我也常听一些没有接触过编程的朋友对Stata望而却步,他们常说:

“虽然看不懂,但是觉得很厉害的样子。”

所以Stata是什么?

Stata’s two programming languages, ado and Mata, each support object-oriented programming. [P] class explains object-oriented programming in ado. Most users interested in object-oriented programming will wish to do the programming in Mata. See [M-2] class to learn about object-oriented programming in Mata.

Stata是套体系完整的面向对象的编程语言。两种编程语言,adoMata ,第一种较为常用,第二种更为强大。我也只会第一种,第二种浅尝辄止了。因为后来遇到Stata解决不了的问题就寻求其它编程语言完成了。所以没有什么动力学Mata了。不过还是对Mata心怀崇敬,有时间就一定开始学习。

Stata能做什么?

  1. 数据获取与处理;
    使用Stata可以比较快速的获取多种数据并迅速整理成研究者所需要的数据。
  2. 精美统计图形绘制与导出。
    Stata的绘图系统是相当完整的。通过绘图主题的选择,Stata作图也可以非常的精美。
  3. 严谨可重复的实证研究。

在熟练使用Stata之前,你的论文原材料可能是这样的(下图并不是论文的原材料,是我随便截的,只是想表达乱):

在此之前可能你的主要数据处理工具是Excel,并且还不会Excel VBA,所以经常会整夜整夜的复制粘贴。而这些工作实际上用几行Stata语句就能完成。

那你用熟练了Stata之后你的论文数据是什么样的呢?(假如你是一个向我一样的强迫症患者)

这个文件夹的目录结构是:

.
├── ADO
│   ├── carryforward.ado
│   ├── carryforward.hlp
│   ├── estadd.ado
│   ├── estadd.hlp
│   ├── esttab.ado
│   └── esttab.hlp
├── DATA
│   ├── beta.csv
│   └── mydata.dta
├── DO
│   ├── 表2-1-描述性统计表.do
│   ├── 表3-1-模型估计结果.do
│   ├── 图3-1-每个月份的风险暴露变化对股票流动性影响的差异.do
│   ├── 表3-2-模型估计结果.do
│   ├── 图3-2-每个年份风险暴露变化对股票流动性影响的差异.do
│   ├── 表4-1-稳健性检验结果.do
│   └── 设定绘图主题.do
├── DOCS
│   └──  风险暴露的变化对股票流动性的影响.pdf
├── IMAGE
│   ├── 年份效应.png
│   └── 月份效应.png
├── 主程序.do
└── 参考文献
    └── 110228635.pdf

在用Stata之前,每次画图你可能都要在Excel上面点击无数次。而用Stata之后,即使是下面这样复杂的图,你只需要一行命令就能绘制出来:

此外,如果你还会一些数据库或其它编程软件,Stata能够很好的和它们交互使用。

如果说Stata不是最好的,我觉得Stata是做实证研究的最好工具。

  1. Stata作为商业软件,有着专业且负责的团队维护。所以Stata的帮助文档是最让人喜爱的,这些也是很多开源软件无法比拟的。
  2. Stata的速度相对较快,Stata的启动速度远快于Matlab、SAS这些软件,且对电脑硬件要求较低,这是非常重要的,如果你想用一个软件,然后打开它就要等待几分钟。那我想你可能很快就烦了。另外Stata运行的速度也足够快。可以满足大多数用户的需要。
  3. Stata同提供了很多可以把统计表格导出到Word、PDF和Tex文档的命令。实际上Stata15的putdocx命令搭配其它的一些命令可以实际实现论文的编排。

我想以上的每一条都足以成为大家认真学习Stata的理由。

下面就让我们进入Stata的世界吧!

Stata基本操作

Stata系统文件夹

运行sysdir即可得到Stata的系统文件夹列表:

. sysdir
   STATA:  /Applications/Stata/
    BASE:  /Applications/Stata/ado/base/
    SITE:  /Applications/Stata/ado/site/
    PLUS:  /Users/mr.cheng/Library/Application Support/Stata/ado/plus/
PERSONAL:  /Users/mr.cheng/Library/Application Support/Stata/ado/personal/
OLDPLACE:  ~/ado/
. adopath
  [1]  (BASE)      "/Applications/Stata/ado/base/"
  [2]  (SITE)      "/Applications/Stata/ado/site/"
  [3]              "."
  [4]  (PERSONAL)  "/Users/mr.cheng/Library/Application Support/Stata/ado/personal/"
  [5]  (PLUS)      "/Users/mr.cheng/Library/Application Support/Stata/ado/plus/"
  [6]  (OLDPLACE)  "~/ado/"

adopath命令的运行结果和sysdir基本相同,其中第三个是表示当前文件夹,这里的排序也是Stata寻找ado文件的顺序。

数据导入

导入系统数据集

系统数据集就是位于系统文件夹的数据集,这些数据集一般是一些示例数据集。导入系统数据集是使用sysuse命令,最有名的系统数据集要数auto数据集了:

sysuse auto, clear

这是个1978年的汽车数据集。这个数据集是这样的:

此外sysuse还可以用来查看所有的系统数据集:

. sysuse dir
  .dta               cjd1617.dta        lifeexp.dta        reshape1.dta
  air2.dta           colorschemes.dta   lutkepohl2.dta     sandstone.dta
  airq.dta           countycode.dta     moneysupply.dta    sexratio.dta
  auto.dta           educ99gdp.dta      network1.dta       smoking.dta
  auto2.dta          fullauto.dta       network1a.dta      sp500.dta
  autornd.dta        ghanaage.dta       nhanes2f.dta       splotxmpl.dta
  bplong.dta         gnp96.dta          nlsw88.dta         stackxmpl.dta
  bpwide.dta         grunfeld.dta       nlswide1.dta       surface.dta
  brewmeta.dta       houseprice.dta     nlswork.dta        tsline1.dta
  cancer.dta         jd14151617xxb.dta  nlswork2.dta       tsline2.dta
  census.dta         jd141516cjd.dta    parent.dta         uslifeexp.dta
  child.dta          jd2017zsjh.dta     pop2000.dta        uslifeexp2.dta
  citytemp.dta       jdcourse2018a.dta  population.dta     voter.dta
  citytemp4.dta      lbw.dta            rate2.dta          xtline1.dta

使用all选项可以查看所有的:

. sysuse dir, all
  .dta                  child.dta             network1a.dta
  __i10v2003.dta        china_map.dta         nhanes2f.dta
  __i10v2004.dta        citytemp.dta          nlsw88.dta
  __i10v2006.dta        citytemp4.dta         nlswide1.dta
  __i10v2007.dta        cjd1617.dta           nlswork.dta
  __i10v2008.dta        colorschemes.dta      nlswork2.dta
  __i10v2009.dta        countycode.dta        parent.dta
  __i10v2010.dta        echarts_worldmap.dta  pop2000.dta
  __i10v2011.dta        educ99gdp.dta         population.dta
  __i10v2012.dta        fullauto.dta          rate2.dta
  __i10v2013.dta        ghanaage.dta          reshape1.dta
  __i10v2014.dta        gini_prov.dta         sandstone.dta
  __i10v2016.dta        gnp96.dta             sexratio.dta
  __icd10.dta           grunfeld.dta          smoking.dta
  __icd10cm.dta         houseprice.dta        sp500.dta
  __icd10pcs.dta        icd9_cod.dta          splotxmpl.dta
  air2.dta              icd9_cop.dta          stackxmpl.dta
  airq.dta              jd14151617xxb.dta     surface.dta
  auto.dta              jd141516cjd.dta       tsline1.dta
  auto2.dta             jd2017zsjh.dta        tsline2.dta
  autornd.dta           jdcourse2018a.dta     uslifeexp.dta
  bplong.dta            lbw.dta               uslifeexp2.dta
  bpwide.dta            lifeexp.dta           voter.dta
  brewmeta.dta          lutkepohl2.dta        xtline1.dta
  cancer.dta            moneysupply.dta
  census.dta            network1.dta

导入网络数据集

网络数据集是存放在Stata公司服务器上的一些数据集,通常也是一些示例数据集。例如导入lifeexp.dta数据集:

. webuse lifeexp, clear
(Life expectancy, 1998)

这是一个1998年预期寿命数据集,括号里面的内容是label data

webuse query可以用来查看当前webuse指向的数据仓库地址:

. webuse query
(prefix now "http://www.stata-press.com/data/r15")

我还可以换个地址:

. webuse set "http://www.czxa.top/cuse/c"
(prefix now "http://www.czxa.top/cuse/c")

这个网址是我的数据仓库下的一个名称为c的子文件夹,里面放置着c开头的数据集。设定好网址指向之后就可以调用该指向下的数据集了:

webuse cjd1617, clear
(金融学1617年成绩单)

这是我们班同学2016和2017年的成绩单,为了保护隐私,我抹去了大家的姓名。
重新把webuse的指向的网址指向设定为默认网址,只需要运行下面的命令即可:

. webuse set
(prefix now "http://www.stata-press.com/data/r15")

调用我的个人仓库里面的数据集

《计量经济学及Stata应用》这本书配套了很多数据集。以往我们同学在学习的时候都要把数据集拷贝到自己的电脑上,然后使用的时候还有把工作目录设定为那个数据集文件夹,然后才能开始读数据。

是不是太麻烦了,我们能不能像sysuse、webuse这样直接使用数据呢?所以我就写了这套cuse命令。这个命令不仅仅是为这本书的,里面还包含了很多我经常使用的数据集,例如各省市的行政区号之类的。

运行下面的命令即可安装这个命令:

/* 首先你需要安装github命令,这个命令是用来安装github上的命令的 */
net install github, from("https://haghish.github.io/github/")
/* 然后就可以安装这个命令了 */
github install czxa/cuse, replace

或者直接安装:

net install cuse, from("http://www.czxa.top/cuse") replace

这个命令的使用方法是:

/* cuselist可以用来查看数据库中包含的数据 */
. cuselist
【0】
----------------------------------------------------------------------
1.  000001.dta: 平安银行历史股票数据
【a】
----------------------------------------------------------------------
1.  amricancellmapdata.dta: 美国蜂窝地图各个省份的位置坐标
【c】
----------------------------------------------------------------------
1.  cellmapdata.dta: 中国蜂窝地图各个省份的位置坐标
1.  countycode.dta: 中国各省市区县编号(即身份证前六位号码)
2.  china_label.dta: 中国地图标签
3.  china_map.dta: 中国地图数据
4.  china_city_spatial_distance.dta: 中国地级地图数据集
5.  china_province_spatial_distance.dta: 中国省级地图数据集
6.  cjd1617.dta: 金融学16和17年成绩单
7.  cpi.dta: 中国CPI2008/1-2017/11
8.  countrysexratio.dta: knoema各国总人口性别比例数据
9.  ctbc2.dta: 中债国债2002-2017年国债到期收益率
10.  cnstockholiday.dta: 上交所与深交所休市日期
11.  cnstockincome.dta:1989年-2017年所有上市公司的基本收入状况
----------------------------------------------------------------------
【d】
----------------------------------------------------------------------
1.  echarts_worldmap.dta: ECharts世界地图各国中英文名称对照
【g】
----------------------------------------------------------------------
1.  gdpjdlj.dta: 中国GDP季度累计2006/第一季度-2017/第三季度
2.  gini_prov.dta: 1995-2010中国各省份Gini系数
【h】
----------------------------------------------------------------------
1.  huaihe.dta: 2017年淮河供暖政策对人预期寿命的影响模仿数据集
2.  houseprice.dta: 中国百城房价数据集
----------------------------------------------------------------------
【j】
----------------------------------------------------------------------
1.  jdcourse2018a.dta: 2018年上半年暨南大学排课选课表
2.  jd2017zsjh.dta: 暨南大学2017年各省招生人数
----------------------------------------------------------------------
【l】
----------------------------------------------------------------------
1.  life_expentancy.dta: 2010年中国各省市自治区人口出生时预期寿命
【m】
----------------------------------------------------------------------
1.  moneysupply.dta: 2008/1-2017/11中国货币供应量M0M1M2
----------------------------------------------------------------------
【p】
----------------------------------------------------------------------
1.  pm10.dta: 2017年淮河供暖政策对人预期寿命影响的原始数据集
2.  population.dta: 2010年中国各区县人口
3.  population_prov.dta: 2002-2014年全国各省市年末人口
4.  pjw.dta: 分城市人口、就业与工资(1990-2016)
----------------------------------------------------------------------
【s】
----------------------------------------------------------------------
1.  station.dta: 中国所有火车站车站代码
2.  smoking.dta: 合成控制法的美国39个洲的香烟销售量数据集
2.  sexratio.dta: knoema各国总人口性别比例数据
----------------------------------------------------------------------
【t】
----------------------------------------------------------------------
1.  titanic.dta: 泰坦尼克号生存数据集
2.  tourism.dta: 旅游事业发展情况
----------------------------------------------------------------------
【书籍数据集】
注意!如果你想调用的数据集的名字里含大写字母,你需要把它的首字母调成小写才能调用!
1. 《计量经济学及Stata应用》——陈强著
2. 《高级计量经济学及Stata应用》——陈强著
3. 《An Introduction to Stata Programming, Second Edition》——Christopher F. Baum著

然后如果你想调用需要的数据集,使用cuse命令,这个命令的语法是:

cuse filename , [clear web savetosystem]

下划线表明该选项可以简写为下划线部分。

例如,假如我想调用书上第10页下面的grilic_small.dta数据集,下面的命令即可:

cuse grilic_small, c w s

上面的命令就实现了把内存清空、从网络获取数据和存入系统文件夹三个操作,以后如果需要这个数据集,用sysuse也可以读取了:

sysuse grilic_small, clear

另外需要注意:如果需要读的数据集的名字中首字母是大写的,需要把首字母改成小写的。

例如,书本105页的5.7中用到的数据集是Woody3.dta,调用它的方法是:

cuse woody3, clear web

读入dta数据集

这个也是最为常用的命令,use命令。用来导入Stata的dta格式的数据集。
例如我想读取grilic_small.dta数据集,下面的命令即可:

// 首先把工作目录设置到这个数据集所在的文件夹
cd ~/Desktop/datasets
// 然后使用use命令读取该数据集
use grilic_small, clear
// 当然你也可以这么做,也就是路径+文件名
use ~/Desktop/datasets/grilic_small.dta, clear
// 但是不推荐。建议的工作流程是把所有的工作都在工作目录下进行。

读入csv数据集

csv格式的数据集是逗号分隔的文本文件,可以直接用Excel打开。例如,我想读取pingan.csv文件,这个文件下载地址为:
http://www.czxa.top/mr/pingan.csv
Stata的copy命令可以被用来下载文件:

copy "http://www.czxa.top/mr/pingan.csv" pingan.csv, replace

然后你就能在你的工作目录里面发现这个文件了。如果你不清楚你的工作目录在哪里,可以运行下面的命令:

. pwd
/Users/mr.cheng/Desktop

然后我们把这个csv文件读入Stata:

import delimited using pingan.csv, clear

此外,你好可以通过GUI导入:

稍等片刻,在对话框里进行选择,然后提交即可:

为了保存这个操作,我们最好把这个提交动作的命令复制粘贴到我们的do文档里面:

import delimited /Users/mr.cheng/Desktop/pingan.csv, ///
    delimiter(comma) varnames(1) encoding(utf8) clear

读入xls、xlsx数据

这两种格式的数据是Excel的数据,例如我想导入书上的grilic_small.xls数据集:

// 如果你暂时没有拿到这个数据集,可以用copy下载:
copy "http://www.czxa.top/mr/grilic_small.xls" grilic_small.xls, replace
import excel using grilic_small.xls, clear firstrow

firstrow表示设定第一行为变量名。

同样导入Excel文件也能通过界面鼠标点击操作。

导入自由格式的txt文件

下面我要介绍的这种是在使用Stata爬数据的时候最为常用的一种方法了。
假如我想爬东方财富网的采购经理人指数:网址是:中国 采购经理人指数(PMI)。那么第一步就是我的把这个网页读入Stata,下面的命令就可以实现了:

// 首先把这个网页下载存储为temp.txt文件:
copy "http://data.eastmoney.com/cjsj/pmi.html" temp.txt, replace
// 然后读入Stata,把每一行的前20000个字符(可以确定是整行了)读入strL格式的变量v。
infix strL v 1-20000 using temp.txt, clear

然后你会发现这个变量v里面的有些观测值是乱码的,这是因为这个网页文件不是UTF-8编码的,所以需要先把这个temp.txt文件转一下码。Stata中的转码命令是:

unicode encoding set gb18030
unicode translate 文件名.后缀名
unicode erasebackups, badidea

所以我们把这个temp.txt文件转个码再读如Stata中:

// 首先清空内存,这个清空是非常彻底的清空。
clear all
copy "http://data.eastmoney.com/cjsj/pmi.html" temp.txt, replace
unicode encoding set gb18030
unicode translate temp.txt
unicode erasebackups, badidea
infix strL v 1-20000 using temp.txt, clear

然后就会发现乱码问题得到了解决。
Stata14之前的版本创建的数据集读入Stata14、15都是需要转码的,都可以用这三句命令完成。

但是每次都打这三句是不是非常麻烦?所以我简单把这三句封装成了一个小命令utrans
这个命令位于我的finance命令包中,安装finance包即可安装这个命令:

github install czxa/finance, replace

然后上面的转码只需要utrans + 文件即可完成

. utrans temp.txt
转码完成

数据处理

当我们把数据读入之后就能进行数据处理了。数据处理的熟练程度直接决定了你写论文的速度。这里介绍一些常用的Stata处理数据的命令。

describe:审视数据

这个命令可以被简写为des。建议初学者不要立即使用简写,以免后来记不住命令的全称。

. sysuse auto, clear
(1978 Automobile Data)

. des

Contains data from /Applications/Stata/ado/base/a/auto.dta
  obs:            74                          1978 Automobile Data
 vars:            12                          13 Apr 2016 17:45
 size:         3,182                          (_dta has notes)
------------------------------------------------------------------------------------
              storage   display    value
variable name   type    format     label      variable label
------------------------------------------------------------------------------------
make            str18   %-18s                 Make and Model
price           int     %8.0gc                Price
mpg             int     %8.0g                 Mileage (mpg)
rep78           int     %8.0g                 Repair Record 1978
headroom        float   %6.1f                 Headroom (in.)
trunk           int     %8.0g                 Trunk space (cu. ft.)
weight          int     %8.0gc                Weight (lbs.)
length          int     %8.0g                 Length (in.)
turn            int     %8.0g                 Turn Circle (ft.)
displacement    int     %8.0g                 Displacement (cu. in.)
gear_ratio      float   %6.2f                 Gear Ratio
foreign         byte    %8.0g      origin     Car type
------------------------------------------------------------------------------------
Sorted by: foreign

list:列示数据

这个命令有两种用法,第一种是列示某些变量,第二种是列示某些观测值:

/* 列示整个数据表 */
list
/* 列示变量price和make */
list price make
/* 列示所有变量的第5-10个观测值 */
list in 5/10
/* 列示变量price和make的最后一个观测值 */
list price make in -1
/* 列示price大于10000的部分 */
list price if price > 10000

gsort/order:排序

sort命令正在被逐渐弃用。gsort用于观测值的排序,order用于变量的排序。

/* 把price按照由低到高的顺序排列 */
gsort price
/* 把price按照由高到低的顺序排列 */
gsort -price
/* 先排rep78再排price */
gsort rep78 -price

codebook:描述数据的内容

codebook
codebook price

generate:生成新变量

这个命令可以简写为gen

/* 例如我想生成一列等于观测值编号的变量v */
gen v = _n
/* 再例如我想生成一列等于总观测值数据的变量v1 */
gen v1 = _N
/* 还可以和数学函数一起使用,例如生成pirce的平方序列 */
gen price2 = price^2

gen还可以和by/bysort一起使用。例如我想生成一个表示rep78变量的每个值的个数的变量v2:

bysort rep78: gen v2 = _N

replace: 替换

/* 例如把rep78中的缺失值都替换成0(Stata中的数值型变量的缺失值用点表示,其实际数值是无穷大) */
replace rep78 = 0 if rep78 == .
/* 或者 */
replace rep78 = 0 if missing(rep78)

/* 把price变量取值在10000-15000的观测值替换成-1 */
replace price = -1 if inrange(price, 10000, 15000)

/* 把make变量取值为“Olds Starfire”和“Dodge St. Regis”的替换成“”(空字符串) */
replace make = "" if inlist(make, "Olds Starfire", "Dodge St. Regis")

/* 把make变量中含字母A的观测值替换成空字符串 */
replace make = "" if index(make, "A")

rename:重命名变量

这个命令可以简写为ren。

/* 例如把make重命名为make1 */
ren make make1

drop:删除

这个命令也有两种用法:删除变量和删除观测值。

/* 删除变量make1 */
drop make1
/* 删除第5-10个观测值 */
drop in 5/10
/* 删除price大于10000的观测值 */
drop if price > 10000
/* 使用通配符:删除m开头的变量 */
drop m*

summarize:查看描述性统计量

这个命令可以简写为sum

sum price
sum price if price > 10000
sum price, detail

tabulate:查看频率频数表

这个命令可以被简写为tab。

tab rep78

pwcorr:计算相关系数表

pwcorr price length weight, star(0.05) sig
corr price weight
/* 还可以用来计算协方差矩阵 */
corr price weight, c

display

这个命令可以被简写为di,用于打印:

display "这是一行字符串"
di as text "这是一行字符串"
di as error "这是一行字符串"
di as result "这是一行字符串"
di in green "这是一行字符串"
di in red "这是一行字符串"
di in yellow "这是一行字符串"
di in white "这是一行字符串"
di as input di in white "这是一行字符串"
di 3 + 4
di 2^0.5

数据导出

save: 导出为dta文件

save auto2, replace

export delimited:导出为csv文件

export delimited using auto2.csv, replace

export excel:导出为excel文件

export excel using auto2.xlsx, replace

绘图

histogram:绘制直方图

这个命令可以被简写为hist。

cuse grilic_small, c w
hist s, width(1) freq

推荐大家使用plotplain主题,刚刚按照finance命令包的时候这个主题已经安装好了,使用scheme()选项可以指定选项。

hist s, width(1) freq sch(plotplain)

scatter:绘制散点图

/* 例如,我想观察工资和受教育年限之间的关系 */
gen n = _n
sc lnw s, mlab(n) msize(*2) mc(red*0.6) xti("受教育年限") yti("对数工资")

统计相关

grilic数据集示例

cuse grilic, c w
ren lw lnw
des
sum
sum lnw, d
hist lnw, width(0.1)
kdensity lnw, normal normop(lp(dash)) leg(pos(6) row(1)) ///
  xti("工资对数") yti("密度") ///
  yla(,format(%6.1f))

tw ///
kdensity lnw || ///
kdensity lnw if s == 16, lp(dash) ||, ///
	xti("工资对数") yti("密度") ///
	leg(pos(6) row(1)) ///
	yla(#4, format(%6.1f)) xla(, format(%6.1f)) ///

验证迭代期望定律

迭代期望定律:

$$E(Y) = E_x[E(Y|x)]$$

使用数据集grilic.dta来验证该定律:

$$E(lnw) = E_{rns}[E(lnw|rns)]$$

sum lnw if rns == 1
return list
local a = r(mean)
sum lnw if rns == 0
return list
local b = r(mean)
di (`a'*204+`b'*554)/(204+554)

结果是5.6867388

另一方面,E(lnw)为:

sum lnw

忽略舍入误差,两者完全相等。从而得证。

t检验、方差分析和因子分析

t检验

t检验使用ttest命令。

单样本t检验

单样本t检验就是均值检验,检验某组数的均值是否等于某个值。
例如检验auto数据集中的mpg的变量是否为20:

sysuse auto, clear
ttest mpg == 20  

One-sample t test
------------------------------------------------------------------------------
Variable |     Obs        Mean    Std. Err.   Std. Dev.   [95% Conf. Interval]
---------+--------------------------------------------------------------------
     mpg |      74     21.2973    .6725511    5.785503     19.9569    22.63769
------------------------------------------------------------------------------
    mean = mean(mpg)                                              t =   1.9289
Ho: mean = 20                                    degrees of freedom =       73

    Ha: mean < 20               Ha: mean != 20                 Ha: mean > 20
 Pr(T < t) = 0.9712         Pr(|T| > |t|) = 0.0576          Pr(T > t) = 0.0288

双样本t检验

双样本t检验也就是检验两组样本的均值是否相等。例如,我想检验国产车和进口车的价格的均值是否相等:

ttest price, by(for)

Two-sample t test with equal variances
------------------------------------------------------------------------------
   Group |     Obs        Mean    Std. Err.   Std. Dev.   [95% Conf. Interval]
---------+--------------------------------------------------------------------
Domestic |      52    6072.423    429.4911    3097.104    5210.184    6934.662
 Foreign |      22    6384.682    558.9942    2621.915     5222.19    7547.174
---------+--------------------------------------------------------------------
combined |      74    6165.257    342.8719    2949.496    5481.914      6848.6
---------+--------------------------------------------------------------------
    diff |           -312.2587    754.4488               -1816.225    1191.708
------------------------------------------------------------------------------
    diff = mean(Domestic) - mean(Foreign)                         t =  -0.4139
Ho: diff = 0                                     degrees of freedom =       72

    Ha: diff < 0                 Ha: diff != 0                 Ha: diff > 0
 Pr(T < t) = 0.3401         Pr(|T| > |t|) = 0.6802          Pr(T > t) = 0.6599

方差分析

方差分析(Analysis of Variance,简称ANOVA),又称“变异数分析”,是R.A.Fisher发明的,用于两个及两个以上样本均数差别的显著性检验。

单因素方差分析

webuse systolic, clear
anova systolic drug

               Number of obs =         58    R-squared     =  0.3355
               Root MSE      =    10.7211    Adj R-squared =  0.2985       
        Source | Partial SS         df         MS        F    Prob>F
    -----------+----------------------------------------------------
         Model |  3133.2385          3   1044.4128      9.09  0.0001
               |
          drug |  3133.2385          3   1044.4128      9.09  0.0001
               |
      Residual |  6206.9167         54    114.9429  
    -----------+----------------------------------------------------
         Total |  9340.1552         57   163.86237  

双因素方差分析

. anova systolic drug disease

           Number of obs =         58    R-squared     =  0.3803
           Root MSE      =    10.5503    Adj R-squared =  0.3207
    Source | Partial SS         df         MS        F    Prob>F
-----------+----------------------------------------------------
     Model |  3552.0722          5   710.41445      6.38  0.0001
           |
      drug |  3063.4329          3   1021.1443      9.17  0.0001
   disease |  418.83374          2   209.41687      1.88  0.1626
           |
  Residual |  5788.0829         52   111.30929  
-----------+----------------------------------------------------
     Total |  9340.1552         57   163.86237