1 运算符 exp

STATA 共有四种运算,分别是代数运算、字符运算、关系运算和逻辑运算。
image.png
运算的优先序:!(或=),>,<,<=,>=,==,&,| 当忘记或者无法确定优先序的时候,最好用括号将优先序表达出来,在最里层括号中的表示式将被优先执行。

2 函数概览 function

函数只不过是一些编号的小程序,这些小程序会对数据按一定的规则进行处理,之后报告结果。实际上,谁也记不住这么多函数,因此,首先要学会查找函数的帮助,当记不住的时候,随时去查寻帮助。记住下面的命令才是最关键的。
. help function
Type of function See help
———————————————————+————————————-
Mathematical functions math functions
Probability distributions and
density functions density functions
Random-number functions random-number functions
String functions string functions
Programming functions programming functions
Date functions date functions
Time-series functions time-series functions
Matrix functions matrix functions
弹出来的对话框告诉我们,STATA 包括八类函数,分别是数学函数,分布函数,随机数函数,字符函数,程序函数,日期函数,时间序列函数和矩阵函数。
本章主要介绍数学函数和字符函数,其他函数将在后面相应的章节介绍。
常用函数一览表
image.png

3 数学函数 math functions

1 三角函数,指数和对数函数

数学函数可以直接对数据进行运算,也可以对变量进行运算。

  1. . di sqrt(4) //开方,输出 2
  2. . di sqrt(6+3) //先相加,再开方,输出 3
  3. . di abs(-100) //求绝对值,输出 100
  4. . di exp(1) //表示 e1
  5. //输出 2.7182818
  6. . di ln(exp(2)) //先求 e2,再取对数,得到 2
  7. . di pi //pi 为圆周率,得到 3.1415927
  8. . di cos(pi) //pi 的余弦值,得到-1

数学函数可以直接对数据进行运算,也可以对变量进行运算。
对变量的操作:

  1. clear
  2. set obs 5 //设定 5 个观察值
  3. gen x=_n //生成新变量 x,取值为 1,2,3,4,5
  4. gen y1=exp(x) //取指数
  5. gen y2=ln(x) //取对数
  6. gen y3=sin(exp(x) ) +cos(ln(x)) //取对数
  7. l //显示刚生成的数据

2 取整和四舍五入

取整

  1. . di int(3.49) //int()取整,不论后面的小数是什么,只取小数点前的数值
  2. . di int(3.51) //输出 3
  3. . di int(-3.49) //输出-3
  4. . di int(-3.51) //输出-3

四舍五入

  1. . di round(3.49) //round()取整,四舍五入,结果为 3
  2. . di round(3.51) //四舍五入,结果为 4
  3. . di round(-3.49) //四舍五入,结果为-3
  4. . di round(-3.51) //四舍五入到个位数,结果为-4
  5. . di round(3.345,.1) //四舍五入到十分位,结果为 3.3
  6. . di round(3.351,.1) //四舍五入到十分位,结果为 3.4
  7. . di round(3.345,.01) //四舍五入到百分位,结果为 3.35
  8. . di round(3.351,.01) //四舍五入到百分位,结果为 3.35
  9. . di round(335.1,10) //四舍五入到十位,结果为 340

对变量的操作

  1. . sysuse auto, clear
  2. . gen nprice=price/10000 //将价格变到以万为单位
  3. . gen nprice2=round(nprice,0.01) //四舍五入到百分位
  4. . list nprice* //比较结果

3 求和及求均值 gen 和 egen

  1. clear
  2. set obs 5
  3. gen x=_n //生成新变量 x, x 的取值从 1 到 5
  4. gen y=sum(x) //求列累积和
  5. egen z=sum(x) //求列总和,注意比较 y 和 Z 的不同
  6. egen r=rsum(x y z) //求 x+y+z 总和
  7. egen havg = rowmean(x y z) //求 havg=(a+b+c)/3
  8. egen hsd = rowsd(x y z) //求 a、b 和 c 的方差
  9. egen rmin = rowmin(x y z) //求 x y z 这三个变量的最小值
  10. egen rmax = rowmax(x y z) //求 x y z 这三个变量的最大值
  11. list //注意比较 y 和 z 的不同。
  12. egen avgx=mean(x) //求列均值
  13. egen medx=median(x) //求列中值
  14. egen stdx = std(x) //求变异系数 cvi=(xi-mx)/s,注意 s=Σ(xi-mx)2/(n-1)
  15. replace y=3 in 3
  16. egen byte dxy = diff(x y) //当 x 与 y 相等时,differ 取 0,若不相等为 1

更多关于 egen 命令的用法将参考帮助:help egen

4 其他

  1. sysuse auto, clear
  2. egen rmpg = rank(mpg) //求 mpg 的次序
  3. sort rmpg
  4. list mpg rmpg //列示结果
  5. egen highrep78 = anyvalue(rep78), v(3/5) /若 rep78 不为 34 5, 则为缺失值/
  6. list rep78 highrep78
  7. clear
  8. input a b
  9. 1 0
  10. 0 0
  11. 1 1
  12. 0 1
  13. 0 0
  14. 1 .
  15. . 0
  16. end
  17. egen ab=group(a b) /按 a b 来进行交叉分组,a=0,b=0 为第一组,…,a=1,b=1 为第四组,缺失值不参与分组/
  18. egen ab2=group(a b),missing //将缺失的组当作另外的一组
  19. l //显示分组结果

image.png

  1. clear
  2. set obs 100 //设定 100 个观察值
  3. gen age=_n //生成一个假设的年龄变量 age,依次取 1,2,…,100
  4. recode age (min/30=1) (30/60=2) (60/max=3),gen(agegrp)
  5. /生成新的分组变量 agegrp,当年龄 age 30 及以下时取值为 130 60 260 以上为 3,感觉操作也是太简单了/

4 字符函数 string functions

任务:将美国汽车数据中汽车商标变量值简化为取前三个字母,得到一个新的变量 make3

  1. sysuse auto, clear
  2. gen str3 make3=substr(make,1,3) //取变量 make 的前三个字符赋给 make3
  3. list make*

任务:下表的数据是一个多选题,请把这道多选题转化为四个单选题,例如变量a 表示“你今天早餐吃的是:1 稀饭 2 馒头 3 大饼 4 豆腐脑”。变量 a 不容易处理,可以用以下命令转化为四个 0-1 变量,分别为 na1=是否吃稀饭,na2=是
否吃馒头…
image.png

  1. gen na1=strpos(a, "1")!=0 /*strops(s1,s2)返回字符 s2 在 s1 中的位置,如果在 s1 中找不到 s2,则返回 0。上述命令是实际
  2. 上有两步,先得 0 或非零,然后判断转化为 0-1。
  3. gen na2=strpos(a, "2")!=0
  4. gen na3=strpos(a, "3")!=0
  5. gen na4=strpos(a, "4")!=0

image.png

  1. di word(“this is a dog”,4) //显示第四个字母 dog

5 分类操作 by

任务:下列数据为家庭成员数据 family.dta,其中 hhid 为家庭编码,age 为家庭成员的年龄。将下表数据复制到 STATA,然后另存为 family.dta
image.png
要求:
(1)生成一个新变量 hhsize,该变量表示共有多少个家庭成员。
(2)给每个家庭成员一个编码 id。如第一个家庭的第一个成员编码为 11;
(3)按家庭生成一个全家成员平均年龄值 mage。
(4)对每个家庭,分别按年龄大小排序,然后生成一个家庭成员代码,即家庭内年龄最小的成员代码为 1,年龄最大的家庭成员,代码为 nid。
最后需要生成的数据集如下:
image.png
请自己先思考,再参考如下操作 :
将上表数据复制粘贴到 STATA 数据编辑器,然后执行下面的命令

  1. use family, clear
  2. by hhid,sort :gen hhsize=_N //得到家庭规模 hhsize
  3. by hhid,sort :gen id=_n+hhid*10 //为家庭成员编码
  4. by hhid,sort: egen mage=mean(age) //求平均年龄
  5. sort hhid age //按户排序,在每个户内按年龄大小排序
  6. by hhid: gen nid=_n //在户内按年龄大小为家庭成员编码
  7. use family, clear
  8. bysort hhid (age): gen nid1=_n //括号中的变量 age 只排序,不参于分组。
  9. bysort hhid age: gen nid2=_n // hhid 和 ag e 都既用来参与排序也分组
  10. list //比较上面两个命令得到的不同结果
  11. webuse stan2, clear
  12. expand 2 if transplant //将 transplant==1 的观察值再复制一个
  13. sort id
  14. by id: generate byte posttran = (_n==2) /*生成一个新变量 posttran,使得 对同一个人,第一个观察值取 0,第 二个观察值取 1*/
  15. by id: generate t1 = stime if _n==_N /*生成新变量 t1,使得在同一个 id 下, 对第二期取值为 stime,否则为“.”
  16. gsort –id