如何避免从 long 中意外生成浮点数
How to avoid accidentally generating a float from a long
简而言之,我遇到的实际问题是,我从一些存储为 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 位数字作为 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
简而言之,我遇到的实际问题是,我从一些存储为 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 位数字作为 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