我简单地体验到的实际问题是,我从一些存储为long
整数的SSN(社会安全号码)开始,然后是generate
个变量。但是,如果我没有考虑它而未能为新变量指定long
,则Stata默认创建float
而不是double
或long
,因此丢失了SSN中包含的数据。
具体而言,我特别使用美式SSN,因为它们有9位数字。但是我最好能够判断出任何具有7位或更多位数的ID变量(即Stata float
变量尾数的精度)是一个问题。
显然,我可以通过指定long
来避免这种情况,但Stata似乎没有像这样丢失信息的正确行为。例如,compress
太聪明了,不能做这样的事情。我正在使用下面的版本12.1。我确定已经问过这个问题,但我还没有在这里或通过Google找到任何内容。
. generate long ssn = uniform() * 1e9
. generate ssn_copy = ssn
. format ssn_copy %10.0f
. clist
ssn ssn_copy
1. 58066154 58066152
2. 675948726 675948736
3. 715280476 715280448
. describe
ssn long %12.0g
ssn_copy float %10.0f
编辑添加:@NickCox提到使用字符串作为标识符。我尝试过,有趣的是Stata非常聪明,可以从另一个字符串变量自动生成一个字符串。我喜欢这种行为,但它似乎与浮动是默认的文档不一致。似乎(在理论上)应该发生的是,如果我尝试从字符串创建变量而不指定它是字符串,那么Stata会引发异常。
Stata insheet
也很聪明,可以读取9位数字作为长而不是浮点数,所以我不确定甚至可以说generate
与其他数据一致Stata命令如insheet
。
此外,虽然我没有看到使用字符串存储ID变量的问题(除了内存效率低),我也没有看到使用整数的任何问题。
答案 0 :(得分:1)
是的,默认值为float
。这是一个备受争议的话题(特别是在www.statalist.com),它将Stata社区分开。来自[U] 12.2.2
Numeric storage types:
数字可以存储在五种变量类型之一:byte,int,long, float(默认值)或double。字节自然地存储在1中 字节。
目前,由于这个"功能"而不会丢失用户注意信息。
另一个参考是
http://blog.stata.com/tag/precision/,
你可以在Statalist上发现一些关于这个主题的帖子。
请参阅help clonevar
制作一份尊重原始变量存储类型的副本。例如:
clear
set more off
// original
gen long myvar = 1
// "unexpected"
gen myvar2 = myvar
// "expected"
clonevar myvar3 = myvar
describe