Stata:仅保留给定变量的最小值,最大值和中值的观察值

Stata: Keep only observations with minimum, maximum and median value of a given variable

在 Stata 中,我有一个包含两个变量的数据集:idvar,假设有 1000 个观察值。变量 var 的类型为 float 并且对所有观察值采用不同的值。我只想保留三个观察值,其中 var 是 var 的最小值、var 的最大值或 var 的中值。

我目前的做法:

summarize var, detail
local varmax = r(max)
local varmin = r(min)
local varmedian= r(p50)
keep if inlist(float(var),float(`varmax') , float(`varmedian'), float(`varmin'))

我面临的问题是有时 inlist 条件与其中一个值不匹配。例如。我最终得到两个观察结果而不是三个,例如一个最小值和一个最大值,但不是中位数。我怀疑这与精度问题有关。如您所见,我尝试将所有数字都转换为浮点数,但这显然不够。

非常感谢对我的解决方案或替代解决方案的任何修复(如果可能,无需安装额外的软件包),谢谢!

这首先不是精度问题。

当(1)值的数量是偶数且(2)中位数是两个不同的中心值的平均值时,这是一个不可避免的问题。那么中位数本身不是数据集中的值,不会被keep找到。

考虑数据集 1、2、3、4。中位数 2.5 不在数据中。这很常见;事实上,这正是所有值不同且观察次数偶数的预期结果。

可能会出现其他问题,因为最小值、中值和最大值中的两个甚至三个可能彼此相等。这不是您当前的问题,但它可能会影响其他变量(例如指示变量)。

精度问题是可能的。

这是一个旨在避免所有这些困难的通用解决方案。

如果你collapse要最小值,中位数。 max 然后 reshape 你可以避免这个问题。您将始终获得三个结果,即使它们在数值上相等 and/or 不存在于数据中。

在下面的简单示例中,仅需要标识符来安抚 reshape。在其他问题中,您可能想 collapse 使用 by() 然后您的标识符就准备好了。但是,在这种情况下,您不太可能想要 reshape

. clear

. set obs 4
number of observations (_N) was 0, now 4

. gen y = _n

. collapse (min)ymin=y (max)ymax=y (median)ymedian=y

. gen id = _n

. reshape long y, i(id) j(statistic) string 
(note: j = max median min)

Data                               wide   ->   long
-----------------------------------------------------------------------------
Number of obs.                        1   ->       3
Number of variables                   4   ->       3
j variable (3 values)                     ->   statistic
xij variables:
                      ymax ymedian ymin   ->   y
-----------------------------------------------------------------------------

. list 

     +---------------------+
     | id   statis~c     y |
     |---------------------|
  1. |  1        max     4 |
  2. |  1     median   2.5 |
  3. |  1        min     1 |
     +---------------------+

综上所述,拥有(很多?)只有三个观察值的数据集听起来很糟糕的数据管理策略。也许这是从一些更大的问题中提取出来的。

更新

这是另一种精确保留 3 个观测值的方法。除了最小值和最大值之外,我们还使用保持 "low median" 的规则,即当观测值数量为偶数时,取平均值的两个值中较低者作为中值,否则单个值作为中值。 (在 Stephen Stigler 的令人愉快的术语中,我们可以在第一种情况下谈论 "comedians"。)

. sysuse auto, clear
(1978 Automobile Data)

. sort mpg

. drop if missing(mpg)
(0 observations deleted)

. keep if inlist(_n, 1, cond(mod(_N, 2), ceil(_N/2), floor(_N/2)), _N)
(71 observations deleted)

. l mpg

     +-----+
     | mpg |
     |-----|
  1. |  12 |
  2. |  20 |
  3. |  41 |
     +-----+
如果 _N 为奇数,

mod(_N, 2) 为 1,如果 _N 为偶数,则为 0。 cond() 中的表达式如果观察数为奇数则选择 ceil(_N/2),如果是偶数则选择 floor(_N/2)