5函数与运算符
5.1运算符exp
STATA共有四种运算,分别是代数运算、字符运算、关系运算和逻辑运算。
运算符一览表 代数运算 + - * / ^ sqrt() ~= + 加 减 乘 除 指数 开方 不等于 字符相加 ! ~ | & 逻辑运算 不 不 或 和 > < >= <= == != ~= 比较关系 大于 小于 不小于 不大于 等于 不等于 不等于 运算的优先序:!(或~),^,-(负号),/,*,-(减),+,!=(或~=),>,<,<=,>=,==,&,| 当不确定优先序的时候,最好用括号将优先序直接表达出来。 5.1.1代数运算
包括加(+)、减(-)、乘(*)、除(/),幂(^)和负数(-),当遇到缺失值或者运算不可行时(比如除数为零)均会得到缺失值。
例:求正式的值,若x=4,y=2,显然经过心算,应该为:-1 . di –(4+2^(4-2))/(2*4) //di是display命令的略写,表示显示结果 . di 4-2 //输出2 . di 3*5 //输出15
. di 8/2 //8除以2,输出4 . di 2^3 //2的立方,输出8
. di –(2+3^(2-3))/sqrt(2*3) //括号运算优先,想一想,结果应为多少?
中国人民大学 陈传波
STATA十八讲:5函数与运算符
实际上,更多的情形是两个或多个变量的直接运算。比如,将进口车的价格都增加100元(可能是关税),而国产车不变。
. sysuse auto, clear
. gen nprice=price+foreign*100 . list nprice price foreign 5.1.2字符运算
加(+)号同样可用于字符运算,当加号出现在两个字符之间时,两个字符将被连成一个字符。比如把”我爱” “STATA”合并在一起,命令为:
. scalar a=”我爱” +“STATA” //要特别注意,引号必须是半角和英文模式 . scalar list a //scalar命令将两个字符运算后的结果赋于a,然后显示a . scalar a=2 +“3” //注意到:字符与数值不能直接相加,显示类型不匹配
type mismatch r(109); 5.1.3关系运算
关系运算包括大于、小于、等于;不等于、不小于、不大于等多种比较关系。特别要注意到STATA中的等于符号为“==”,是两个等号连写在一起,不同于赋值时用的单个等号“=”。 . di 3<5 //输出结果为1,意味着3小于5为真 . di 3>5 //输出的结果为0,意味着3大于5为假。
当数据中含有缺失值的时候需要特别小心,因为系统缺失值大于任何一个数据,利用这一点,我们可以使用条件语句排除缺失值。
任务:将年龄分组为65岁以下和65岁及以上两组,缺失值显然不能包括在任何一组中。
age 38 . 65 42 18 80 . clear . edit
将上述数据复制到STATA中,然后退出数据编辑器。 . gen agegrp1=(age>=65)
中国人民大学 陈传波
STATA十八讲:5函数与运算符
生成的数据中,将缺失值视为65岁以上分在了高龄组,这是错误的 . gen agegrp2=(age>=65) if age<.
生成的数据中,将缺失值排除在外,正确!这一命令常被用于生成虚拟变量。 . gen agegrp3=(age==65) if age<. //仅判断是否恰好为65岁
. list //比较agegrp1、 agegrp2和agegrp3的差异,体会if age<.的作用。
age 38 . 65 42 18 80 Agegrp1 0 1 1 0 0 1 Agegrp2 0 . 1 0 0 1 Agegrp3 0 . 1 0 0 0 5.1.4逻辑运算
逻辑运算包括非(!),和(&)、或(|)三种,主要用于条件语句中。 例:列示出价格大于10000元的任何车,或者小于4000元的国产车。 . sysuse auto, clear
. list price foreign if price>10000 | price<4000 & forei==0
在STATA中,和(&)优先于或(|),因此上述命令与下面的命令等价: . list price foreign if price>10000 | (price<4000 & forei==0)
试一试下面的命令,这里列示的是国产车中价格高于10000元或者低于4000元的车。 . list price foreign if (price>10000 | price<4000) & forei==0
5.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
中国人民大学 陈传波
STATA十八讲:5函数与运算符
Programming functions programming functions Date functions date functions Time-series functions time-series functions Matrix functions matrix functions
弹出来的对话框告诉我们,STATA包括八类函数,分别是数学函数,分布函数,随机数函数,字符函数,程序函数,日期函数,时间序列函数和矩阵函数。本章主要介绍数学函数和字符函数,其他函数将在后面相应的章节介绍。
常用函数一览表 数值型函数 函数 abs(x) comb(n,k) exp(x) fill() int(x) ln(x) log10(x) mod(x,y) round(x) sqrt(x) sum(x) 随机uniform() 函数 invnormal(uniform()) 字符real(s) 函数 string(n) substr(s,n1,n2) word(s,n) 系统_n 变量 _N _pi 含义 绝对值 从n中取k个的组合 指数 自动填充数据 取整 对数 以10为底的对数 = x - y*int(x/y) 四舍五入 开方 求和 均匀分布随机数 标准正态分布随机数 字符型转化为数值型 数值型转化为字符型 举例 abs(-9)=9 comb(10,2)=45 exp(0)=1 int(5.6) = 5, int(-5.2) = -5. ln(1)=0 log10(1000)=3 mod(9,2)=1 round(5.6)=6 sqrt(16)=4 第10讲将介绍 第11讲将介绍 从S的第n1个字符开始,Substr(“this”,2,2)=is 截取n2个字符 返回s的第n个字符 当前观察值的序号 共有多少观察值 π Work(“this”,3)=i 5.3数学函数math functions
5.3.1三角函数,指数和对数函数
数学函数可以直接对数据进行运算,也可以对变量进行运算。 . di sqrt(4) //开方,输出2
. di sqrt(6+3) //先相加,再开方,输出3 . di abs(-100) //求绝对值,输出100
中国人民大学 陈传波
STATA十八讲:5函数与运算符
. di exp(1) //表示e1,输出2.7182818 . di ln(exp(2)) //先求e2,再取对数,得到2 . di _pi //_pi为圆周率,得到3.1415927 . di cos(_pi) //_pi的余弦值,得到-1
数学函数可以直接对数据进行运算,也可以对变量进行运算。 对变量的操作: clear
set obs 5
gen x=_n //生成新变量 x,取值为1,2,3,4,5 gen y1=exp(x) //取指数 gen y2=ln(x) //取对数
gen y3=sin(exp(x) ) +cos(ln(x)) //取对数 l
5.3.2取整和四舍五入 取整
. di int(3.49) //int()取整,不论后面的小数是什么,只取小数点前的数值 . di int(3.51) //输出3 . di int(-3.49) //输出-3 . di int(-3.51) //输出-3 四舍五入
. di round(3.49) //round()取整,四舍五入,结果为3 . di round(3.51) //四舍五入,结果为4 . di round(-3.49) //四舍五入,结果为-3
. di round(-3.51) //四舍五入到个位数,结果为-4 . di round(3.345,.1) //四舍五入到十分位,结果为3.3 . di round(3.351,.1) //四舍五入到十分位,结果为3.4 . di round(3.345,.01) //四舍五入到百分位,结果为3.35
中国人民大学 陈传波
STATA十八讲:5函数与运算符
. di round(3.351,.01) //四舍五入到百分位,结果为3.35 . di round(335.1,10) //四舍五入到十位,结果为330 对变量的操作 . sysuse auto, clear
. gen nprice=price/10000 //将价格变到以万为单位 . gen nprice2=round(nprice,0.01) //四舍五入到百分位 . list nprice* //比较结果 5.3.3求和及求均值gen和egen
clear set obs 5
gen x=_n //生成新变量x, x的取值从1到5 gen y=sum(x) //求列累积和 egen z=sum(x) //求列总和 egen r=rsum(x y z) //求x+y+z总和
egen hsum = rowtotal(x y z) //求hsum=a+b+c egen havg = rowmean(x y z) //求havg=(a+b+c)/3 egen hsd = rowsd(x y z) //求a、b和c的方差 egen rmin = rowmin(x y z) //求x y z)三个变量的最小值 egen rmax = rowmax(x y z) //求x y z)三个变量的最大值 list //注意比较y和z的不同。 egen avgx=mean(x) //求列均值 egen medx=median(x) //求列中值 egen stdx = std(x) //求列标准差 replace y=3 in 3
egen byte dxy = diff(x y) //当x与y相等时,differ取0,若不相等为1 更多关于egen命令的用法将参考帮助:help egen
中国人民大学 陈传波
STATA十八讲:5函数与运算符
5.3.4其他
sysuse auto, clear
egen rmpg = rank(mpg) //求mpg的次序 sort rmpg
list mpg rank //列示结果
egen highrep78 = anyvalue(rep78), v(3/5) /*若rep78不为3、4或5, 则为缺失值*/ list rep78 highrep78 clear
input a b 1 0 0 0 1 1 0 1 0 0 1 . . 0 end
egen ab=group(a b)
egen ab2=group(a b),missing l
a b ab ab2 ------------------
1. 1 0 3 3 2. 0 0 1 1 3. 1 1 4 4 4. 0 1 2 2 5. 0 0 1 1 ------------------
6. 1 . . 5 7. . 0 . 6
5.4字符函数string functions
任务:将美国汽车数据中汽车商标变量值简化为取前三个字母,得到一个新的变量make3
sysuse auto, clear
gen str3 make3=substr(make,1,3) list make*
任务:下表的数据是一个多选题,请把这道多选题转化为四个单选题
中国人民大学 陈传波
STATA十八讲:5函数与运算符
a 2 2 2、1、3 1、2、4 4、2、1 1、2 2 1、2 gen na1=strpos(a, \"1\")!=0 //strops(s1,s2)返回字符s2在s1中的位置 gen na2=strpos(a, \"2\")!=0 gen na3=strpos(a, \"3\")!=0 gen na4=strpos(a, \"4\")!=0 list
a na1 na2 na3 na4 1. 2 0 1 0 0 2. 2 0 1 0 0 3. 1、2、3 1 1 1 0 4. 1、2、4 1 1 0 1 5. 1、2、4 1 1 0 1 6. 1、2 1 1 0 0 7. 2 0 1 0 0 8. 1、2 1 1 0 0 webuse genxmpl2, clear
gen name2 = word(name,2) //新变量name2,取值为name的第二个字母 list n*
5.5 分类操作by
clear edit
*将下表复制粘贴到STATA数据编辑器中,注意粘贴时把光标停在第一格。 x 1 1 1 y 1.1 1.2 1.3 中国人民大学 陈传波
STATA十八讲:5函数与运算符
2 2 2.1 2.2 gen n=_n //生成一个新变量n=1,2,3,4,5 gen N=_N //生成一个新变量N=5,5,5,5,5 gen z=y[1] //生成一个新变量z=y的第一个观察值 l 1. 2. 3. 4. 5.
x y n N z -----------------------
1 1.1 1 5 1.1 1 1.2 2 5 1.1 1 1.3 3 5 1.1 2 2.1 4 5 1.1 2 2.2 5 5 1.1
by x, sort: gen n1=_n //注意到n1与n的不同,n1按x分类进行操作 by x, sort: gen N1=_N by x, sort: gen z1=y[1] list
x y n N z n1 N1 z1
1. 1 1.1 1 5 1.1 1 3 1.1 2. 1 1.2 2 5 1.1 2 3 1.1 3. 1 1.3 3 5 1.1 3 3 1.1 4. 2 2.1 4 5 1.1 1 2 2.1 5. 2 2.2 5 5 1.1 2 2 2.1
任务:下列数据为家庭成员数据family.dta,其中hhid为家庭编码,age为家庭成员的年龄。将下表数据复制到STATA,然后另存为family.dta
hhid 1 1 1 1 age 86 42 36 57 中国人民大学 陈传波
STATA十八讲:5函数与运算符 1 2 2 2 28 42 5 40 要求:(1)生成一个新变量hhsize,该变量表示共有多少个家庭成员。(2)给每个家庭成员一个编码id。如第一个家庭的第一个成员编码为11;(3)按家庭生成一个全家成员平均年龄值mage。(4)对每个家庭,分别按年龄大小排序,然后生成一个家庭成员代码,即家庭内年龄最小的成员代码为1,年龄最大的家庭成员,代码为nid。 最后需要生成的数据集如下:
hhid 1 1 1 1 1 2 2 2 age 28 36 42 57 86 5 40 42 hhsize 5 5 5 5 5 3 3 3 id 15 13 12 14 11 22 23 21 mage 49.8 49.8 49.8 49.8 49.8 29 29 29 nid 1 2 3 4 5 1 2 3 请自己先思考,再参考如下操作 :
将上表数据复制粘贴到STATA数据编辑器,然后执行下面的命令 use family, clear by hhid,sort :gen hhsize=_N //得到家庭规模hhsize by hhid,sort :gen id=_n+hhid*10 //为家庭成员编码 by hhid,sort: egen mage=mean(age) //求平均年龄
sort hhid age //按户排序,在每个户内按年龄大小排序 by hhid: gen nid=_n //在户内按年龄大小为家庭成员编码 +---------------------------------------+ | hhid age hhsize id mage nid | |---------------------------------------| 1. | 1 28 5 11 49.8 1 | 2. | 1 36 5 12 49.8 2 | 3. | 1 42 5 13 49.8 3 | 4. | 1 57 5 14 49.8 4 | 5. | 1 86 5 15 49.8 5 | |---------------------------------------| 6. | 2 5 3 21 29 1 | 7. | 2 40 3 22 29 2 | 8. | 2 42 3 23 29 3 |
另一个例子:
中国人民大学 陈传波
STATA十八讲:5函数与运算符
use family, clear
bysort hhid (age): gen nid1=_n //括号中的变量age只排序,不参于分组。 bysort hhid age: gen nid2=_n // hhid 和ag e都既用来参与排序也分组 list //比较上面两个命令得到的不同结果 hhid age nid1 nid2 --------------------------
1. 1 28 1 1 2. 1 36 2 1 3. 1 42 3 1 4. 1 57 4 1 5. 1 86 5 1 --------------------------
6. 2 5 1 1 7. 2 40 2 1 8. 2 42 3 1 webuse stan2, clear
expand 2 if transplant //将transplant==1的观察值再复制一个 sort id
by id: generate byte posttran = (_n==2) /*生成一个新变量posttran,使得 对同一个人,第一个观察值取0,第 二个观察值取1*/
by id: generate t1 = stime if _n==_N /*生成新变量t1,使得在同一个id下, 对第二期取值为stime,否则为“.”
中国人民大学 陈传波
因篇幅问题不能全部显示,请点此查看更多更全内容