如何避免从 long 中意外生成浮点数

How to avoid accidentally generating a float from a long

简而言之,我遇到的实际问题是,我从一些存储为 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 位数字作为 long 而不是 float,所以我不确定它甚至可以说 generate 与其他数字一致Stata 命令如 insheet.

此外,虽然我没有发现使用字符串存储 ID 变量有任何问题(除了内存效率低下),但我也没有看到为此使用整数有任何问题。

是的,默认是float。这是一个争论不休的话题(特别是在 www.statalist.com),它分裂了 Stata 社区。来自 [U] 12.2.2 数值存储类型:

Numbers can be stored in one of five variable types: byte, int, long, float (the default), or double. bytes are, naturally, stored in 1 byte.

目前,由用户负责确保信息不会因此而丢失 "feature"。

另一个参考是

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