Stata中的数值型
本文作者:余术玲
文字编辑:李钊颖
技术总编:李朋冲
最近,小编从CSMAR数据库上下载了一些财务报表,把它导入到Stata以后,发现,由于科学计数法的问题,数据的精度有所变化,该怎么去处理这些问题呢?
这涉及到Stata中的数值型转换问题。在初学Stata时,需要经常区分变量的类型。与一些统计程序包不同的是,Stata支持大量的变量类型。Stata通常把变量划分为三类:数值型,字符型和日期型。今天小编将结合format为大家详细介绍Stata中的数值型。
一.Stata中的数值型
1. 1 Stata中的数值型概念
Stata中的数值型变量用0,1,2…9和小数点“.”与+、-(正负号)来表示,另外还有科学计数法表示的数据,如5.2718E+10,意思是5.2718*1010,5.2e-2表示5.2*10-2。
数值型变量按其精度区分,有5种类型:
byte表示占1个字节,介于-127和100之间的整数;
int表示占2个字节,介于-32,767与32,740之间的整数;
long表示占4个字节,介于-2,147,483,647和2,147,483,620之间的整数;
float存储的变量的字节数也是4位;double存储的变量的字节数是8位。
几种数值类型的取值范围和字节大小如下表所示:
当运算精度要求很高的时候,需要将变量设置成浮点型(float)或双精度型(double)。需要注意的是,1和1.0000的精度是不同的,前者在(0.5,1.5)区间内近似,而后者在(0.99995,1.00005)区间内近似。若多次运算反复取四舍五入,精度较低时,将使计算误差迅速变大。然而,精度提高时,占用的内存资源也对应增多。
1.2 结合数据介绍数值型
在Stata中生成一个新变量,观测值取数值,这个观测值默认类型是浮点型。如下程序:
clear all
set obs 1
gen a = 99 //生成一个新变量a,取值为99
describe //描述数据集的属性信息
观察显示结果,a的storage type显示为float型。
compress命令可以尽可能地减少数据的占用空间,有时候会改变数值类型,但是compress命令是在不损害信息的基础上压缩。如下程序:
compress //在不损害信息的基础上压缩,使数据占用空间尽可能小
describe
变量a由float型变成了byte型,byte型的范围是(-127,100),观测值99在byte范围内,储存空间只占一个字节。
当变量超出byte的范围时会自动转为int型:
replace a = 101
describe
观察显示结果,a由byte型变成了int型,因为101超出了byte型的范围,自动升为int型。
同理,当a取值超出int型范围时,会自动转换为long型。如下程序:
replace a = 32741
describe
a由int型变成long型,因为32741超出了int型的范围,自动升为long型。
二.数据显示格式:format
format只控制数据的显示格式,并不改变内存中数据的大小。通常的格式是f格式,也叫固定格式;e格式,指数格式(科学计数法),用于非常大或非常小的数字;g格式,也叫一般格式(数据的转换)。Stata会自动选择f格式或e格式,以达到更好的效果。下面结合具体的数据,介绍数值型变量的显示格式。
2.1%#w.#df格式
%#w.#df这个格式是我们经常遇到的数值型变量格式,%为固定用法。在Stata中,数值和字符串的格式默认都是右对齐的,想要左对齐,在%后加一个负号即可。我们通过一个例子来介绍,首先生成10个数,程序及结果如下:
clear
input v1
0.0012345
0.0123456
0.1234567
1.2345678
12.3456789
123.456789
1234.5678
12345.1234
123456.78
1234567.89
end
gen v2 = v1
gen v3 = v1
gen v4 = v1
gen v5 = -v1
format %4.3f v2
format %8.3f v3
format %-09.3f v4
format %8.3f v5
list v1 v2 v3 v4 v5
生成数据的默认格式是%9.0g,通过对比,我们可以清楚地看出,在%#w.#df格式中,#w表示字节长度,#d表示保留几位小数,这里需要注意以下几点:
第一,对比v2和v3我们发现两个输出数据一模一样,然而一个格式是%4.3f,另一个格式是%8.3f,这是为什么呢?原来在%#w.#df格式中,当字节长度#w小于8时,默认把8当作字节长度。
第二,从上图我们可以发现v3的第8,9,10行都是%#w.#de格式,这是因为,如果数值的长度超过设置的#w,则会显示科学记数法格式。
第三,对比v3和v5,都是%8.3f格式,第7行v3是1234.568,v5是-1.2 e+03,说明负号也会占一个字节长度。
第四,由于v4变量显示格式为format %-09.3f ,加了一个负号,所以由默认的右对齐变成了左对齐,并且如果位数不够,还会在数字前面补零。
第五,在类似%#w.#df格式中,#w一定得大于#d,要不然会报错。
2.2%#w.#dg格式
format %7.0g v2
format %9.2g v3
format %9.6g v4
format %9.0g v5
list v1 v2 v3 v4 v5
运行结果如下:
对于%#w.#dg格式,#w代表字节长度为#w,#d表示保留#d个有效数字。如果#d等于0,则显示最大字节长度为#w的格式。如果#d不等于0,则显示#d个有效数字。#d针对的是小数,所以#d小于整数的位数时,整数部分都会显示出来。
这里值得注意的是,在%#w.#dg格式中,会给符号留一个字节位置,所以对v5的前九行显示了七个数字,一个小数点和一个负号,正好等于最大字节长度——九个字节长度,第十行显示了一个空格,一个负号和七个数字,也是九个字节长度。另外,对于v1的前三行,小数点左边其实是0,也占了一个字节,所以v1的前三行显示了八个数字,一个小数点,等于最大字节长度9。
2.3%#w.#dgc和%#w.#dfc格式
format %12.2fc v2
format %12.0gc v3
list v1 v2 v3
结果:
以%#w.#dfc格式为例,%#w.#dfc格式和%#w.#df格式的区别在于多相应数量的千分符。从上图中,我们可以清楚看出,v2、v3的第10行数字多了两个千分符。
三.结合数据解决精度问题
在文章开头,小编提到把Excel表格导入到Stata中,由于科学计数法的问题,会导致数据有所变化(精度问题),这时可以通过数据显示格式来解决。小编从国泰安上面下载整理了万科在2016年第2、3季度的利润表数据,原始数据如下截图:
clear all
import excel using 万科2016年2-3季度利润表.xls //导入万科2016年第2-3季度利润表.xls
br
导入之后:
对比发现,导入后的数据和原始数据精度不一样。原始数据D变量的第一个观测值是117054800129.06,导入到Stata中变成了1.171*1011。在研究中如果解决不好数据的精度问题,会导致误差增大,原始数据每一个观测值都是小数点后保留两位小数,所以我们需要用format来重新调整导入到Stata中的数据,增大D变量显示的字节长度,可以使得数据完全显示,同时小数点后保留两位小数。程序如下:
format D %20.2f //用format显示D变量的格式,字节长度为20,小数点后保留两位小数。
以科学计数法表示的较大整数,输入到Stata中后,通过format来调整Stata中数值字节长度,使数据显示和原始一样。
以上就是小编为大家介绍的Stata中的数值型与数据显示格式format,希望对大家有所帮助。
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。