STATA入门5函数与运算符.docx
- 文档编号:5862521
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:14
- 大小:27.81KB
STATA入门5函数与运算符.docx
《STATA入门5函数与运算符.docx》由会员分享,可在线阅读,更多相关《STATA入门5函数与运算符.docx(14页珍藏版)》请在冰豆网上搜索。
STATA入门5函数与运算符
5函数与运算符
5.1运算符exp
STATA共有四种运算,分别是代数运算、字符运算、关系运算和逻辑运算。
运算符一览表
代数运算
逻辑运算
比较关系
+
加
!
不
>
大于
-
减
~
不
<
小于
*
乘
|
或
>=
不小于
/
除
&
和
<=
不大于
^
指数
==
等于
sqrt()
开方
!
=
不等于
~=
不等于
~=
不等于
+
字符相加
运算的优先序:
!
(或~),^,-(负号),/,*,-(减),+,!
=(或~=),>,<,<=,>=,==,&,|
当不确定优先序的时候,最好用括号将优先序直接表达出来。
5.1.1代数运算
包括加(+)、减(-)、乘(*)、除(/),幂(^)和负数(-),当遇到缺失值或者运算不可行时(比如除数为零)均会得到缺失值。
例:
求正式的值,若x=4,y=2,显然经过心算,应该为:
-1
. di–(4+2^(4-2))/(2*4)//di是display命令的略写,表示显示结果
. di4-2 //输出2
.di3*5 //输出15
.di8/2 //8除以2,输出4
.di2^3//2的立方,输出8
.di –(2+3^(2-3))/sqrt(2*3) //括号运算优先,想一想,结果应为多少?
实际上,更多的情形是两个或多个变量的直接运算。
比如,将进口车的价格都增加100元(可能是关税),而国产车不变。
. sysuse auto, clear
.gen nprice=price+foreign*100
. listnpricepriceforeign
5.1.2字符运算
加(+)号同样可用于字符运算,当加号出现在两个字符之间时,两个字符将被连成一个字符。
比如把”我爱”“STATA”合并在一起,命令为:
.scalara=”我爱”+“STATA” //要特别注意,引号必须是半角和英文模式
.scalarlist a //scalar命令将两个字符运算后的结果赋于a,然后显示a
.scalara=2+“3” //注意到:
字符与数值不能直接相加,显示类型不匹配
type mismatch
r(109);
5.1.3关系运算
关系运算包括大于、小于、等于;不等于、不小于、不大于等多种比较关系。
特别要注意到STATA中的等于符号为“==”,是两个等号连写在一起,不同于赋值时用的单个等号“=”。
.di3<5 //输出结果为1,意味着3小于5为真
.di3>5 //输出的结果为0,意味着3大于5为假。
当数据中含有缺失值的时候需要特别小心,因为系统缺失值大于任何一个数据,利用这一点,我们可以使用条件语句排除缺失值。
任务:
将年龄分组为65岁以下和65岁及以上两组,缺失值显然不能包括在任何一组中。
age
38
.
65
42
18
80
.clear
.edit
将上述数据复制到STATA中,然后退出数据编辑器。
. genagegrp1=(age>=65)
生成的数据中,将缺失值视为65岁以上分在了高龄组,这是错误的
. genagegrp2=(age>=65)ifage<.
生成的数据中,将缺失值排除在外,正确!
这一命令常被用于生成虚拟变量。
.genagegrp3=(age==65)if age<. //仅判断是否恰好为65岁
. list//比较agegrp1、agegrp2和agegrp3的差异,体会if age<.的作用。
age
Agegrp1
Agegrp2
Agegrp3
38
0
0
0
.
1
.
.
65
1
1
1
42
0
0
0
18
0
0
0
80
1
1
0
5.1.4逻辑运算
逻辑运算包括非(!
),和(&)、或(|)三种,主要用于条件语句中。
例:
列示出价格大于10000元的任何车,或者小于4000元的国产车。
. sysuseauto, clear
.listprice foreignifprice>10000|price<4000& forei==0
在STATA中,和(&)优先于或(|),因此上述命令与下面的命令等价:
. listpriceforeignifprice>10000| (price<4000&forei==0)
试一试下面的命令,这里列示的是国产车中价格高于10000元或者低于4000元的车。
.list priceforeignif (price>10000 | price<4000) & forei==0
5.2函数概览function
函数只不过是一些编号的小程序,它会按一定的规则进行处理,之后报告结果。
实际上,谁也记不住这么多函数,因此,首先要学会查找函数的帮助,当记不住的时候,随时去查寻帮助。
记住下面的命令才是最关键的。
.helpfunction
Typeoffunction Seehelp
--------------------------------------+-------------------------
Mathematical functions mathfunctions
Probabilitydistributionsand
density functions densityfunctions
Random-numberfunctions random-number functions
String functions stringfunctions
Programmingfunctions programmingfunctions
Date functions datefunctions
Time-seriesfunctions time-series functions
Matrixfunctions matrixfunctions
弹出来的对话框告诉我们,STATA包括八类函数,分别是数学函数,分布函数,随机数函数,字符函数,程序函数,日期函数,时间序列函数和矩阵函数。
本章主要介绍数学函数和字符函数,其他函数将在后面相应的章节介绍。
常用函数一览表
函数
含义
举例
数值型函数
abs(x)
绝对值
abs(-9)=9
comb(n,k)
从n中取k个的组合
comb(10,2)=45
exp(x)
指数
exp(0)=1
fill()
自动填充数据
int(x)
取整
int(5.6)=5,int(-5.2)=-5.
ln(x)
对数
ln
(1)=0
log10(x)
以10为底的对数
log10(1000)=3
mod(x,y)
= x - y*int(x/y)
mod(9,2)=1
round(x)
四舍五入
round(5.6)=6
sqrt(x)
开方
sqrt(16)=4
sum(x)
求和
随机函数
uniform()
均匀分布随机数
第10讲将介绍
invnormal(uniform())
标准正态分布随机数
第11讲将介绍
字符函数
real(s)
字符型转化为数值型
string(n)
数值型转化为字符型
substr(s,n1,n2)
从S的第n1个字符开始,截取n2个字符
Substr(“this”,2,2)=is
word(s,n)
返回s的第n个字符
Work(“this”,3)=i
系统变量
_n
当前观察值的序号
_N
共有多少观察值
_pi
π
5.3数学函数mathfunctions
5.3.1三角函数,指数和对数函数
数学函数可以直接对数据进行运算,也可以对变量进行运算。
.disqrt(4) //开方,输出2
.disqrt(6+3) //先相加,再开方,输出3
. diabs(-100) //求绝对值,输出100
. diexp(1) //表示e1,输出2.7182818
.di ln(exp(2))//先求e2,再取对数,得到2
.di_pi //_pi为圆周率,得到3.1415927
. dicos(_pi) //_pi的余弦值,得到-1
数学函数可以直接对数据进行运算,也可以对变量进行运算。
对变量的操作:
clear
setobs5
gen x=_n //生成新变量 x,取值为1,2,3,4,5
geny1=exp(x) //取指数
gen y2=ln(x)//取对数
gen y3=sin(exp(x)) +cos(ln(x))//取对数
l
5.3.2取整和四舍五入
取整
. diint(3.49) //int()取整,不论后面的小数是什么,只取小数点前的数值
.diint(3.51) //输出3
. di int(-3.49) //输出-3
.diint(-3.51) //输出-3
四舍五入
.diround(3.49) //round()取整,四舍五入,结果为3
.di round(3.51) //四舍五入,结果为4
.di round(-3.49) //四舍五入,结果为-3
.diround(-3.51) //四舍五入到个位数,结果为-4
. diround(3.345,.1) //四舍五入到十分位,结果为3.3
.diround(3.351,.1)//四舍五入到十分位,结果为3.4
. diround(3.345,.01) //四舍五入到百分位,结果为3.35
.di round(3.351,.01) //四舍五入到百分位,结果为3.35
.diround(335.1,10) //四舍五入到十位,结果为330
对变量的操作
.sysuseauto,clear
.gen nprice=price/10000//将价格变到以万为单位
.gen nprice2=round(nprice,0.01) //四舍五入到百分位
. listnprice*//比较结果
5.3.3求和及求均值gen和egen
clear
setobs5
gen x=_n //生成新变量x,x的取值从1到5
geny=sum(x) //求列累积和
egenz=sum(x) //求列总和
egenr=rsum(xy z) //求x+y+z总和
egen hsum = rowtotal(xyz) //求hsum=a+b+c
egenhavg =rowmean(x yz)//求havg=(a+b+c)/3
egenhsd=rowsd(xy z) //求a、b和c的方差
egenrmin=rowmin(xyz) //求xyz)三个变量的最小值
egenrmax=rowmax(x yz) //求xy z)三个变量的最大值
list //注意比较y和z的不同。
egenavgx=mean(x) //求列均值
egenmedx=median(x) //求列中值
egen stdx=std(x)//求列标准差
replacey=3in3
egenbytedxy=diff(x y) //当x与y相等时,differ取0,若不相等为1
更多关于egen命令的用法将参考帮助:
helpegen
5.3.4其他
sysuse auto,clear
egen rmpg= rank(mpg)//求mpg的次序
sortrmpg
listmpgrank //列示结果
egenhighrep78= anyvalue(rep78),v(3/5) /*若rep78不为3、4或5,
则为缺失值*/
listrep78 highrep78
clear
inputaﻩb
1ﻩ0
0ﻩ0
11
0ﻩ1
00
1.
.ﻩ0
end
egenab=group(ab)
egenab2=group(ab),missing
l
ﻩab abab2
------------------
1.10 3 3
2.0 0 1 1
3.1 14 4
4.ﻩ01 22
5.0 01 1
ﻩ------------------
6.1 ..5
7..0 .6
5.4字符函数stringfunctions
任务:
将美国汽车数据中汽车商标变量值简化为取前三个字母,得到一个新的变量make3
sysuseauto,clear
genstr3 make3=substr(make,1,3)
listmake*
任务:
下表的数据是一个多选题,请把这道多选题转化为四个单选题
aﻭ
2
2
2、1、3
1、2、4
4、2、1
1、2
2
1、2
genna1=strpos(a,"1")!
=0 //strops(s1,s2)返回字符s2在s1中的位置
genna2=strpos(a, "2")!
=0
gen na3=strpos(a,"3")!
=0
genna4=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 11 1 0
4.1、2、41 10 1
5.1、2、4 1 10 1
6.1、2 1 1 0 0
7.2 ﻩ 0 1 00
8.ﻩ1、2 1 1 0 0
webuse genxmpl2,clear
genname2= word(name,2) //新变量name2,取值为name的第二个字母
listn*
5.5分类操作by
clear
edit
*将下表复制粘贴到STATA数据编辑器中,注意粘贴时把光标停在第一格。
x
y
1
1.1
1
1.2
1
1.3
2
2.1
2
2.2
genn=_n //生成一个新变量n=1,2,3,4,5
genN=_N //生成一个新变量N=5,5,5,5,5
genz=y[1] //生成一个新变量z=y的第一个观察值
l
xy n N z
-----------------------
1.1 1.1 1 51.1
2.ﻩ1 1.22 5 1.1
3.ﻩ11.3 3 51.1
4.2 2.1 4 51.1
5.22.255 1.1
by x,sort:
genn1=_n//注意到n1与n的不同,n1按x分类进行操作
byx,sort:
genN1=_N
byx,sort:
genz1=y[1]
list
xynN z n1 N1 z1
1.ﻩ1 1.11 51.11 31.1
2.ﻩ11.22 5 1.12 3 1.1
3.ﻩ11.3 3 51.1 3 3 1.1
4.ﻩ22.1 451.1 1 2 2.1
5.ﻩ22.2 55 1.1 22 2.1
任务:
下列数据为家庭成员数据family.dta,其中hhid为家庭编码,age为家庭成员的年龄。
将下表数据复制到STATA,然后另存为family.dta
hhid
age
1
86
1
42
1
36
1
57
1
28
2
42
2
5
2
40
要求:
(1)生成一个新变量hhsize,该变量表示共有多少个家庭成员。
(2)给每个家庭成员一个编码id。
如第一个家庭的第一个成员编码为11;(3)按家庭生成一个全家成员平均年龄值mage。
(4)对每个家庭,分别按年龄大小排序,然后生成一个家庭成员代码,即家庭内年龄最小的成员代码为1,年龄最大的家庭成员,代码为nid。
最后需要生成的数据集如下:
hhid
age
hhsize
id
mage
nid
1
28
5
15
49.8
1
1
36
5
13
49.8
2
1
42
5
12
49.8
3
1
57
5
14
49.8
4
1
86
5
11
49.8
5
2
5
3
22
29
1
2
40
3
23
29
2
2
42
3
21
29
3
请自己先思考,再参考如下操作 :
将上表数据复制粘贴到STATA数据编辑器,然后执行下面的命令
usefamily,clear
byhhid,sort:
gen hhsize=_N//得到家庭规模hhsize
byhhid,sort:
gen id=_n+hhid*10 //为家庭成员编码
byhhid,sort:
egenmage=mean(age) //求平均年龄
sorthhid age //按户排序,在每个户内按年龄大小排序
by hhid:
gen nid=_n //在户内按年龄大小为家庭成员编码
+---------------------------------------+
|hhidage hhsize idmagenid|
|---------------------------------------|
1.|1 28 5 1149.8 1 |
2.|136512 49.8 2|
3.| 1 42513 49.8 3|
4.| 1 575 1449.8 4|
5.| 1 86 515 49.8 5|
|---------------------------------------|
6.| 2 5 3 21 29 1|
7. | 2 40 3 22 29 2|
8.| 2 42 3 23 29 3 |
另一个例子:
use family,clear
bysorthhid (age):
gennid1=_n //括号中的变量age只排序,不参于分组。
bysorthhidage:
gennid2=_n // hhid和age都既用来参与排序也分组
list //比较上面两个命令得到的不同结果
hhid age nid1 nid2
ﻩ--------------------------
1.1 28 1 1
2.ﻩ1362 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.242 3 1
webusestan2,clear
expand2iftransplant //将transplant==1的观察值再复制一个
sortid
by id:
generatebyteposttran=(_n==2)/*生成一个新变量posttran,使得
对同一个人,第一个观察值取0,第
二个观察值取1*/
by id:
generate t1=stimeif_n==_N/*生成新变量t1,使得在同一个id下,
对第二期取值为stime,否则为“.”
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STATA 入门 函数 运算