如何避免从长

时间:2015-06-27 15:47:55

标签: stata

我简单地体验到的实际问题是,我从一些存储为long整数的SSN(社会安全号码)开始,然后是generate个变量。但是,如果我没有考虑它而未能为新变量指定long,则Stata默认创建float而不是doublelong,因此丢失了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变量的问题(除了内存效率低),我也没有看到使用整数的任何问题。

1 个答案:

答案 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