mkdird:\mydata1.12错误提示Listmyvar上述命令试图显示变量myvar,但是结果窗口仅出现如下的显示variablemyvarnotfoundr(111);红色信息表明,没有找到一个叫myvar的变量,的确,我们的数据中并没有这个变量。
List巧妇难为无米之炊。
红色信息下面还有一个天兰色的r(111),用鼠标点击,即可弹进一个帮助信息框,给出错误的更详尽解释。
再比如,我们在求五数概略时,误把sum写成了sun.sununrecognizedcommand:sunr(199);显示说不认识sun这个命令。
附录:常见命令Chapter2命令语句2.1掌握命令语句的格式[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]注:[]表示可有可无的项,显然只有command是必不可少的,下面结合例子分项来讲解命令的各个组成部分。
2.2命令command[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options].cdd:/stata9.useauto,clear//打开美国汽车数据文件auto.dta,后面的clear表示先清除内存中可能存在的数据集.summarize/*很多命令可单独使用,单独使用时,一般是对所有变量进行操作,等价于后面加上代表所有变量的_all。
*/.summarize_all/注意到该命令输出结果与上一个命令完全一样.sum//与前一命令等价,sum为summarize的略写.susu是summarize的最简化略写,不能再简化为s.s//简写前提是不引起混淆。
执行这个命令将出现错误信息unrecognizedcommand:s2.3变量varlist[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]varlist表示一个变量,或者多个变量,多个变量之间用空格隔开。
.cdd:/stata9.useauto,clear.sumprice//求价格的观察值个数,平均值,方差,最小值和最大值.sup//变量和命令均可略写,注意到两个结果完全一样.sut//分数据中有两个变量的开首字母为t(trunk和turn),所以STATA认为t为模糊的省略。
mambiguousabbreviation/红色为错误信息.sumtrtu//求trunk和turn变量的五数概略统计变量名称除以下字符不能用作变量名外,任何字母、字母与数字(单独的数字也不允许)组合均可用做变量名:_all_bbyte_coef_consdoublefloatifinintlong_n_N_pi_pred_rc_se_skipusingwith基本要求如下:_第一个字元可以是英文字母或,但不能是数字;_最多只能包括32个英文字母、数字或下划线;_由于STATA保留了很多以“_“开头的内部变量,所以最好不要用为第一个字元来定义变量。
2.4分类操作byvarlist[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]如果需要分别知道国产车和进口车的价格和重量,可以采用分类操作来求得,.cdd:/stata9.useauto,clear.byforeign:sumpriceweight//分别计算国产车和进口车的价格和重量但如果执行下面两个命令,将出现错误*/.sortprice//按价格从低到高重新排序.byforeign:sumpriceweight*notsorted/*系统提示没有排序,这是因为byvarlist在执行时要求内存中的数据是按照by后面的变量排序的。
当我们用sortprice重新排序后,就打乱了原来按照foreign的排序,所以出现了错误提示。
更正的办法是:*/.sortforeign//按国产车和进口车排序.byforeign:sumpriceweight*更简略的方式是把两个命令用一个组合命令来写。
.byforeign,sort:sumpriceweight如果不想从小到大排序,而是从大到小排序,其命令为gsort。
.gsort-price/按价格从高到低排序.gsortforeign–price/*先把国产车都排在前,进口车排在后面,然后在国产车内再按价格从大小到排序,在进口车内部,也按从大到小排序*/2.5赋值及运算=exp[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]例:生成一个新的价格变量nprice,该变量的取值为原汽车价格变量price的基础上涨10元.cdd:/stata9.useauto,clear.gennprice=price+10//生成新变量nprice,其值为price+10.listpricenprice//比较一下两个变量的取值/*上面的命令generate(略写为gen)生成一个新的变量,新变量的变量名为nprice,新的价格在原价格的基础上均增加了10元。
.replacenprice=nprice-10/*命令replace则直接改变原变量的赋值,nprice调减后与price变量取值相等*/.listpricenprice//再比较一下两个变量,相等。
2.6条件表达式ifexp[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]例:若只想查看国产车的品牌和价格,则加入筛选条件ifforeign==0*/.cdd:/stata9.useauto,clear.listmakepriceifforeign==0*只查看价格超过1万元的进口车(同时满足两个条件),则.listmakepriceifforeign==1&price>10000*查看价格超过1万元或者进口车(两个条件任满足一个).listmakepriceifforeign==1|price>10000*分类型查看价格超过1万元的汽车的品牌和价格.byforeign,sort:listmakepriceifprice>100002.7范围筛选inrange[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]如果要计算较低的前10台车的平均价格,则要先按价格排序,然后仅对前10个车的价格求平均值.cdd:/stata9.useauto,clear.sortprice.sumpricein1/5注意“1/5”中,斜杠不是除号,而是从1到5的意思,即1,2,3,4,5。
如果要计算前10台车中的国产车的平均价格,则可将范围和条件筛选联合使用。
.sumpricein1/10ifforeign==02.8加权weight[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]任务:下表是2005年湖北省高考640分及以上成绩一分一段的人数统计,第一列score为高考分数,第二列num为该分数段的人数。
现在我们要求640分及以上考生的平均分数。
scorenum65019364926648236471664621645266443264323642386412964038操作:先将上面的表格复制,然后进入STATA,执行如下命令.clear//清空STATA.edit然后把光标定位在表格的第一行第一列,点右键,选择粘贴(paste),上表数据便被复制到STATA中,退出数据编辑器sumscore//思考:得到的结果是640分及以上考生的平均分吗?简单地使用sum命令得到的平均成绩显然是不正确的,因为各个分数下的人数是不一样的,正确的计算需要加权,加权的办法是.sumscore[weight=num]/*加权计算,比较该结果与sumscore的区别,实际上,不用权重选项时,相当于权重相等。
*/.sumscore[w=n]//w为weight的略写,n为num的简写,两命令等价2.9其他可选项,options[byvarlist:]command[varlist][=exp][ifexp][inrange][weight][,options]许多命令都有一些可选项例如,我们不仅要计算平均成绩,还想知道成绩的中值,方差,偏度和峰度等*/.sumscore,detail.sumscore,d//d为detail的略写,两个命令完全等价注意,结果中显示了1%,5%等分位数,意思是把变量从小到大排序,第1%位置处的取值是多少,第10%的位置上的取值是多少。
显然,50%位置处的取值是中位数。
此外,加了detail选项后,还得到最小的前5个数,最大的5个数,以及峰度和偏度等。
*再如,list命令也有一些可选项.cdd:/stata9.useauto,clear.listpricein1/30,sep(10)//每10个观察值之间加一横线.listpricein10/30,sep(2)//每2个观察值之间加一横线.listprice,nohead//不要表头Chapter3数据3.1打开示例数据和网络数据:use3.1.1示例数据示例数据为STATA帮助文件中所用的数据,其后辍名为.dta,如果在STATA软件当前路径下,直接用use命令即可打开;如果不在当前路径下,则可以使用sysuse命令打开。
.useauto,clear//打开汽车数据auto.dta.cdd:///改变路径到d:/.useauto,clearfileauto.dtanotfound//系统提示无法找到文件,因为auto.dta不在d:/r(601);.sysuseauto,clear//无论当前路径是什么,该命令均能打开系统自带文件3.1.2从网络获取数据上述示例数据可能没有全部下载到你的所用的电脑中,因此简单地使用use和sysuse命令时,可能出现错误,如.usenlswork,clearfilenlswork.dtanotfound此时,如果确定该数据为示例数据,可以直接通过网络获取,其命令为:.use/data/r9/nlswork//从网站获取数据,或者.webusenlswork,clear//与前一命令等价,从STATA官方数据库获取数据webuse只能从/data这一路径获取数据,如果不是该网站的数据,webuse失效,只能把网站地址完全写出来。
使用该命令时必须确保网络连接正常.另一个网络数据较多的地方是波士登大学的数据中心,伍德里奇的《计量经济学导论》一书中所使用的全部数据都可以通过该数据中心获得。
比如.use/ec-p/data/wooldridge/CEOSAL1即打开教材中例2.3中所使用的CEO数据。
use命令只能打开后辍名为“*.dta”格式的数据,.dta格式以外的数据,STATA不能直接读取,需要从外部读入,最简单而直接的办法是复制和粘贴。
但是有时没有其他软件,比如,我们有SAS格式或SPSS格式的数据,但没有SAS软件和SPSS软件,此时需要用STATA提供的其他命令或者使用transfer数据格式转化软件。
在讨论其他输入或导入数据的方法之前,我们先来学习一点数据类型的知识。
3.2数据类型STATA通常把变量划分为三类:分别是数值型,字符型和日期型3.2.1数值变量:用0、1、2…9及+、–(正负号)与小数点“(.)”来表示。
在输入数据时,逗号不能被识别,如1,024应该直接写成1024.5-55.25.2e+35.2e-2后面两个数据为科学计数法的数据,分别表示5200和0.052.其中的e相当于10,因此5.2e+3的意思是:5.2*103=5200数值型变量按其精度区分,又有五种类型,分别是:存贮类型最小最大0-领域字节---------------------------------------------------------------------byte-127100+/-11int-32,76732,740+/-12long-2,147,483,6472,147,483,620+/-14float-1.70141173319*10^381.70141173319*10^36+/-10^-364double-8.9884656743*10^3078.9884656743*10^307+/-10^-3238当运算精度要求很高的时候,需要将变量设置成浮点型或双精度型。
另注意1和1.0000的精度是不同的,前者在(0.5,1.5)区间内近似,而后者在(0.99995,1.00005)区间内近似。
若多次运算反复取四舍五入,精度较低时将使计算误差迅速变大,然而,精度高时占用的内存资源较多。
下面的命令有助于理解变量存贮类型变换。
.clear.setobs1//将设定一个观察值obswas0,now1//提示信息说,之前系统中没有观察单位,现在有了一个.gena=1//生成一个新变量a,令a取值为1.d/*d为describ命令的略写,describ命令显示数据集的属性信息,注意观察显示结果中,a的storagetype为float型,浮点型为默认类型*/Containsdataobs:1vars:1size:8(99.9%ofmemoryfree)storagedisplayvaluevariablenametypeformatlabelvariablelabelafloat%9.0gSortedby:Note:datasethaschangedsincelastsaved.compress//在不损害信息的基础上压缩,使数据占用空间尽可能小awasfloat,nowbyte//a由浮点型变为了字节型.d//注意a的storagetype现在为byte型.replacea=101/*注意a的storagetype现在自动升为int型,因为byte最大只能为100*/awasbytenowint(1realchangemade).replacea=100.compress.d//重新变回到byte型.replacea=32741//直接变到long型,因为int型最大只能到32740.gendoubleb=1//直接生成双精度变量b.recastdoublea//将a变成双精度变量b.d//注意到a和b均为双精度型3.2.2字符串变量字符变量通常是一些身份信息,如姓名,地名。
另外,定类变量也可以用字符变量来表示,如性别分为“男”和“女”。
字符串变量由字母或一些特殊的符号组成(如地名〈籍贯〉变量,迁出地,住址,职业等等)。
字符串变量也可以由数字来组成,但数字在这里仅代表一些符号而不再是数字。
字符串变量通常以引号“”注标,而且引号一般不被视同为字符的一部分,注意这里的引号必须是英文输入状态下的引号。
字符串最多可以达244个字符。
一般用str#来表示字符的多少,如str20表示将有20个字符。
一般三个中文字的姓名需要6个字符。
字符型示例“String”“string””string””string”””//特殊字符串,表示空字符,缺失值。
””//注意与空字符串的区别,含有一个空格”125.27”//”125.27”由于有双引号,将被视同为字符而非数值。
“$2,343.68”“Iloveyou”“旺材是条狗”注意前四个字符串均不相同,大小写是不一样的,有无空格及空格的位置不同,都表示不同的字符串。
对于”125.27”这样的数值型的字符串,可以用real()函数或者destring命令转化成数值型变量。
具体操作见3.3.1。
3.2.3日期型变量在STATA中,1960年1月1日被认为是第0天,因此1959年12月31日为第-1天,2001年1月25日为15000天。
*/.destringdate,replaceignore(“”)/*忽略空格,然后转换,注意这里的”“中间有一个空格,不是””。
*/date:charactersspaceremoved;replacedaslong//成功转换为long型.des//注意到date的storagetype已变为long.listdate//注意到空格消失了date----------1.199912102.200007083.19970302/*与date变量类似,变量price前面有美元符号,变量percent后有百分号,换为数值型时需要忽略这些非数值型字符。
*/.destringpricepercent,gen(price2percent2)ignore(“$,%”).list//注意到price2前面的$号消失,percent2后面的%号消失datepriceprice2percentpercent2---------------------------------------------------------1.19991210$2,343.682343.6834%342.20000708$7,233.447233.4486%86.d//注意到price2和percent2均变为数据值型变量double和byte*3.3.2数值型转化为字符型:tostring.webusetostring,clear/*该数据中年月日的数据类型不一样,不能直接相加生成一个反映日期的新变量*/.des//注意到month为字符型,而年和日为数值型.list.gendate1=month+”/”+day+”/”+year//将年月日构成一个新的日期变量typemismatch//由于month为字符型,年和日为数值型,不同类型不能相加r(109);.tostringyearday,replace//将年和日转化为字符型.des//注意到,现在全部变为字符型.gendate1=month+”/”+day+”/”+year//将年月日构成一个新的日期变量.list//生成了一个新的变量date1,其为三个字符串和两个”/”符号连接而成.gendate2=date(date1,”mdy”)/*date()为日期函数,它以1960年1月1日为第0天,计算从那天起直到括号中指定的某天date1一共过了多少天。
”mdy”指定date1的排列顺序,这里是按照月日年的顺序来表示日期。
*/.list//新生成的date2表示总天数*小游戏:请算算你活了多少天?示例:一个生于1975年12月27日的家伙,他活了?.didate(“1975/12/27”,”ymd”)3.4数据显示格式:format/*format只控制数据的显示格式,并不改变内存中数据的大小。
stateregionpopmedageid--------------------------------------------------1.AlabamaSouth389388829.3000012.AlaskaWest40185126.1000023.ArizonaWest271821529.2098423.5在STATA中直接录入数据:input3.5.1菜单式操作任务:按学号录入五个学生的经济学成绩ideconomy140280390470553操作:(1)点击图标>>在打开的数据表格第一列中录入五个姓名>>在第二列中录入另五个成绩双击var1弹出对话框>>将变量改名为id>>在label中写入学号>>退出弹出窗口;双击var2弹出对话框>>将变量改名为name>>在label中写入姓名>>关闭数据编辑器(2)点击图标保存数据>>给数据命令为student>>退出在建立数据文件后,如果没有存盘,这个文件即是一个“临时的”数据文件,它将随着退出STATA系统时而消失。
当数据文件被存储在后,它将成为一个“永久性”的数据文件,用户可以在以后经常使用它而不必重新建立之。
3.5.2命令操作任务:按学号录入五个学生的学号和姓名idnameeconomy1John402Chris803Jack904Huang435Tom70操作:在command窗口中键入(注:前面的点号不必健入,每完成一行按回车键,黑体为命令,斜体为变量名或文件名):对于字符型变量,需要指明其为字符型并指明最大的字符长度。
clear//清空内存inputidstr10nameeconomy//输入变量名,特别注意姓名前的str10.1John40//录入第一个学生的学号和成绩2Chris80//录入第二个学生的学号和成绩3Jack904Huang705Tom53end//录入数据结束saveeconomy//保存数据到当前路径,文件名为economy3.5.3程序操作(1)打开dofileeditor,键入以下内容:clear//清空内存inputidstr10nameeconomy//输入变量名,特别注意姓名前的str10.1John40//录入第一个学生的学号和成绩2Chris803Jack904Huang705Tom53end//录入数据结束saveeconomy,erplace//保存数据到当前路径,文件名为economy(2)保存程序文件为mydo(3)点击,执行后得到数学成绩3.6导入其他格式数据:insheet经常会遇到的情形是:我们有其他格式的数据,需要导入到STATA中进行分析,建议大家此时将其他格式数据复制到分析数据的文件目录下,然后直接用STATA的导入数据文件命令导入原始数据,用程序模式进行处理,然后导出处理结果。
这样做的最大好处是:既不会破坏最原始的数据文件,又使我们的每一步数据处理和分析过程都有迹可循。
3.6.1insheet命令在本书所附数据文件中找到“3origin.xls”数据,将其打开并另存为“3origin.csv”,(另存时请注意要选择“保存类型”下拉单,选择CSV(逗号分隔)这一项)。
然后在STATA命令窗口中用下述命令导入.insheetusing3origin.csv,clear也可以先将“3origin.xls”数据打开并另存为“3origin.txt”,然后用下面的命令导入.insheetusing3origin.txt,clear当数据中某个变量的位数特别长或者对导入数据的精度要求很高的时候,需要在该命令后面加double选项。
.insheetusing3origin.txt,doubleclear3.6.2infile命令对于“3origin.txt”或“3origin.csv”,还可用infile命令导入STATA,此时需要先指出变量名。
尤其要注意,当变量为字符型时,要先指明。
infileidstr10namegenderminorityeconomymathusingorigin.txt,clear或者infileidstr10namegenderminorityeconomymathusingorigin.csv,clear3.6.3infix命令还有一种标准化的数据,每个变量的位数是确定的,不足时,前面用0补齐,以origin.数据的后面四个变量为例,其数据格式为114068128052029076024390037096115385028536129565如果遇到这种数据格式,需要对照数据说明导入数据,相应的命令为:infixgender1minority2economy3-4math5-6usingorigin.csv,clear其中的数字为对应的数字位数。
3.6.4outsheet命令与前述三个命令相反,有时我们需要将STATA数据导出为其他格式数据,比如文本格式或后缀为acs的格式:此时需要使用outsheet命令实现,该命令的基本格式如下。
outsheetusingmyresult.txtoutsheetusingmyresult.asc此时建立的文件myresult.txt第一行为变量名,第2~6行为变量值。
变量列间用Tab键分隔。
如果不希望在第一行存储变量名,则可以使用nonames选项。
如果文件已经存在,则需要使用replace选项,相应的命令分别为。
outsheetusingmyresult.asc,nonamesoutsheetusingmyresult.asc,nonamesreplace3.6.4使用transfer软件Transfer软件专用于转换不同格式的数据文件,使用起来非常方便。
只需要在inputFileType栏中选择需要转化的原数据文件类型,然后定位打开需要转化的原数据文件。
再选定输出文件类型,指定输出文件的存放位置和文件名。
最后点击transfer按钮。
数据便被转化。
该软件可在/bbs上下载试用,不过做正式工作,建议采用正版软件。
3.7标签数据:label要掌握的命令:为了创建一个完整的文件,要掌握下面的命令。
以上命令可以通过helpcommand查看到具体的命令格式。
*3.7.1变量重命令:rename/*采用直接复制粘贴法,将原始数据粘入stata。
然后退出数据编辑器,先将该数据保存起来,文件名为3origin.dta。
*/save3origin,replace/*新粘入的变量自动命令为var1,var2,...var6,为使变量容易理解和记忆,要将变量重新命名,命令为name。
该命令可以用来标记数据文件,如将文件取名为“2007年秋5632班学习成绩单”*/labeldata“2007年秋5632班学习成绩单”*在文件处理过程中加注说明,命令为notesnote:2007年9月6日由任我行创建该数据*下一次打开数据,要查看创建和数据处理的说明时,直接键入note*3.7.3标签变量:labelvar*也可以用label命令来标记变量,如将id标记为“学号”labelvarid“学号”labelvarname“姓名”labelvargender“性别1=男2=女”labelvarminority“民族”*3.7.4标签变量值:labeldefine和labelvalues*还可以标记变量的取值。
Chapter4数据整理4.1拆分与连接数据文件要掌握的命令为了折分或合并数据文件,要掌握下面的命令。