本文作者:余术玲
文字编辑:李钊颖
技术总编:李朋冲
最近,小编从
CSMAR
数据库上下载了一些财务报表,把它导入到
Stata
以后,发现,由于科学计数法的问题,数据的精度有所变化,该怎么去处理这些问题呢?
这涉及到
Stata
中的
数值型转换
问题。在初学
Stata
时,需要经常区分变量的类型。与一些统计程序包不同的是,
Stata
支持大量的变量类型。
Stata
通常把变量划分为三类:数值型,字符型和日期型。今天小编将结合
format
为大家详细介绍
Stata
中的数值型。
一.
Stata
中的数值型
1. 1 Stata
中的数值型概念
Stata
中的数值型变量用
0,1,2
…9
和小数点
“.”
与
+
、
-
(正负号)来表示,另外还有科学计数法表示的数据,如
5.2718E+10
,意思是
5.2718*10
10
,
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
型:
观察显示结果,
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
格式
初学者会对
%#w.#df
和
%#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
格式
其中的
c
为
comma
的意思,表示对整数部分,每三位数间用逗号隔开。敲入以下程序:
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*10
11
。在研究中如果解决不好数据的精度问题,会导致误差增大,原始数据每一个观测值都是小数点后保留两位小数,所以我们需要用
format
来重新调整导入到
Stata
中的数据,增大
D
变量显示的字节长度,可以使得数据完全显示,同时小数点后保留两位小数。程序如下:
format D %20.2f //用format显示D变量的格式,字节长度为20,小数点后保留两位小数。
以科学计数法表示的较大整数,输入到
Stata
中后,通过
format
来调整
Stata
中数值字节长度,使数据显示和原始一样。
以上就是小编为大家介绍的
Stata
中的数值型与数据显示格式
format
,希望对大家有所帮助。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
爬虫实战——聚募网股权众筹信息爬取
duplicates drop之前,我们要做什么?
类型内置函数-type() isinstance()
数据含义记不住?
—— label“大神”来帮忙
实战演练-如何获取众筹项目的团队信息
Zipfile(一)
tabplot命令
Jupyter Notebook不为人知的秘密
字符串方法(三)
数据,我要“拷打”你
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。