STATA入门5 函数与运算符.docx

上传人:b****4 文档编号:12254995 上传时间:2023-04-17 格式:DOCX 页数:16 大小:24.31KB
下载 相关 举报
STATA入门5 函数与运算符.docx_第1页
第1页 / 共16页
STATA入门5 函数与运算符.docx_第2页
第2页 / 共16页
STATA入门5 函数与运算符.docx_第3页
第3页 / 共16页
STATA入门5 函数与运算符.docx_第4页
第4页 / 共16页
STATA入门5 函数与运算符.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

STATA入门5 函数与运算符.docx

《STATA入门5 函数与运算符.docx》由会员分享,可在线阅读,更多相关《STATA入门5 函数与运算符.docx(16页珍藏版)》请在冰豆网上搜索。

STATA入门5 函数与运算符.docx

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元(可能是关税),而国产车不变。

.sysuseauto,clear

.gennprice=price+foreign*100

.listnpricepriceforeign

 

5.1.2字符运算

加(+)号同样可用于字符运算,当加号出现在两个字符之间时,两个字符将被连成一个字符。

比如把”我爱”“STATA”合并在一起,命令为:

.scalara=”我爱”+“STATA”//要特别注意,引号必须是半角和英文模式

.scalarlista//scalar命令将两个字符运算后的结果赋于a,然后显示a

.scalara=2+“3”//注意到:

字符与数值不能直接相加,显示类型不匹配

typemismatch

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)ifage<.//仅判断是否恰好为65岁

.list//比较agegrp1、agegrp2和agegrp3的差异,体会ifage<.的作用。

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

.listpriceforeignifprice>10000|price<4000&forei==0

在STATA中,和(&)优先于或(|),因此上述命令与下面的命令等价:

.listpriceforeignifprice>10000|(price<4000&forei==0)

试一试下面的命令,这里列示的是国产车中价格高于10000元或者低于4000元的车。

.listpriceforeignif(price>10000|price<4000)&forei==0

5.2函数概览function

函数只不过是一些编号的小程序,它会按一定的规则进行处理,之后报告结果。

实际上,谁也记不住这么多函数,因此,首先要学会查找函数的帮助,当记不住的时候,随时去查寻帮助。

记住下面的命令才是最关键的。

.helpfunction

TypeoffunctionSeehelp

--------------------------------------+-------------------------

Mathematicalfunctionsmathfunctions

Probabilitydistributionsand

densityfunctionsdensityfunctions

Random-numberfunctionsrandom-numberfunctions

Stringfunctionsstringfunctions

Programmingfunctionsprogrammingfunctions

Datefunctionsdatefunctions

Time-seriesfunctionstime-seriesfunctions

Matrixfunctionsmatrixfunctions

弹出来的对话框告诉我们,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

.diln(exp

(2))//先求e2,再取对数,得到2

.di_pi//_pi为圆周率,得到3.1415927

.dicos(_pi)//_pi的余弦值,得到-1

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

对变量的操作:

clear

setobs5

genx=_n//生成新变量x,取值为1,2,3,4,5

geny1=exp(x)//取指数

geny2=ln(x)//取对数

geny3=sin(exp(x))+cos(ln(x))//取对数

l

5.3.2取整和四舍五入

取整

.diint(3.49)//int()取整,不论后面的小数是什么,只取小数点前的数值

.diint(3.51)//输出3

.diint(-3.49)//输出-3

.diint(-3.51)//输出-3

四舍五入

.diround(3.49)//round()取整,四舍五入,结果为3

.diround(3.51)//四舍五入,结果为4

.diround(-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

.diround(3.351,.01)//四舍五入到百分位,结果为3.35

.diround(335.1,10)//四舍五入到十位,结果为330

对变量的操作

.sysuseauto,clear

.gennprice=price/10000//将价格变到以万为单位

.gennprice2=round(nprice,0.01)//四舍五入到百分位

.listnprice*//比较结果

5.3.3求和及求均值gen和egen

clear

setobs5

genx=_n//生成新变量x,x的取值从1到5

geny=sum(x)//求列累积和

egenz=sum(x)//求列总和

egenr=rsum(xyz)//求x+y+z总和

egenhsum=rowtotal(xyz)//求hsum=a+b+c

egenhavg=rowmean(xyz)//求havg=(a+b+c)/3

egenhsd=rowsd(xyz)//求a、b和c的方差

egenrmin=rowmin(xyz)//求xyz)三个变量的最小值

egenrmax=rowmax(xyz)//求xyz)三个变量的最大值

list//注意比较y和z的不同。

egenavgx=mean(x)//求列均值

egenmedx=median(x)//求列中值

egenstdx=std(x)//求列标准差

replacey=3in3

egenbytedxy=diff(xy)//当x与y相等时,differ取0,若不相等为1

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

helpegen

5.3.4其他

sysuseauto,clear

egenrmpg=rank(mpg)//求mpg的次序

sortrmpg

listmpgrank//列示结果

egenhighrep78=anyvalue(rep78),v(3/5)/*若rep78不为3、4或5,

则为缺失值*/

listrep78highrep78

clear

inputab

10

00

11

01

00

1.

.0

end

egenab=group(ab)

egenab2=group(ab),missing

l

ababab2

------------------

1.1033

2.0011

3.1144

4.0122

5.0011

------------------

6.1..5

7..0.6

5.4字符函数stringfunctions

任务:

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

sysuseauto,clear

genstr3make3=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

genna3=strpos(a,"3")!

=0

genna4=strpos(a,"4")!

=0

list

ana1na2na3na4

1.20100

2.20100

3.1、2、31110

4.1、2、41101

5.1、2、41101

6.1、21100

7.20100

8.1、21100

webusegenxmpl2,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

xynNz

-----------------------

1.11.1151.1

2.11.2251.1

3.11.3351.1

4.22.1451.1

5.22.2551.1

byx,sort:

genn1=_n//注意到n1与n的不同,n1按x分类进行操作

byx,sort:

genN1=_N

byx,sort:

genz1=y[1]

list

xynNzn1N1z1

1.11.1151.1131.1

2.11.2251.1231.1

3.11.3351.1331.1

4.22.1451.1122.1

5.22.2551.1222.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:

genhhsize=_N//得到家庭规模hhsize

byhhid,sort:

genid=_n+hhid*10//为家庭成员编码

byhhid,sort:

egenmage=mean(age)//求平均年龄

sorthhidage//按户排序,在每个户内按年龄大小排序

byhhid:

gennid=_n//在户内按年龄大小为家庭成员编码

+---------------------------------------+

|hhidagehhsizeidmagenid|

|---------------------------------------|

1.|12851149.81|

2.|13651249.82|

3.|14251349.83|

4.|15751449.84|

5.|18651549.85|

|---------------------------------------|

6.|25321291|

7.|240322292|

8.|242323293|

另一个例子:

usefamily,clear

bysorthhid(age):

gennid1=_n//括号中的变量age只排序,不参于分组。

bysorthhidage:

gennid2=_n//hhid和age都既用来参与排序也分组

list//比较上面两个命令得到的不同结果

hhidagenid1nid2

--------------------------

1.12811

2.13621

3.14231

4.15741

5.18651

--------------------------

6.2511

7.24021

8.24231

webusestan2,clear

expand2iftransplant//将transplant==1的观察值再复制一个

sortid

byid:

generatebyteposttran=(_n==2)/*生成一个新变量posttran,使得

对同一个人,第一个观察值取0,第

二个观察值取1*/

byid:

generatet1=stimeif_n==_N/*生成新变量t1,使得在同一个id下,

对第二期取值为stime,否则为“.”

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1