Select Stata:仅保留给定变量的最小值、最大值和中值的观测值

Select Stata:仅保留给定变量的最小值、最大值和中值的观测值,select,stata,vlookup,Select,Stata,Vlookup,在Stata中,我有一个包含两个变量的数据集:id和var,比如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')

在Stata中,我有一个包含两个变量的数据集:
id
var
,比如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不在数据中。这很普遍,;事实上,所有的值都是不同的,观测的数量也是不同的

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

精度问题是可能的

这是一个旨在避免所有这些困难的普遍解决办法

如果将
折叠为最小值,则为中间值。max,然后
重塑
可以避免该问题。您将始终得到三个结果,即使它们在数值上相等和/或不存在于数据中

在下面的简单示例中,标识符仅用于安抚
重塑
。在其他问题中,您可能希望使用
by()
折叠
,然后您的标识符就准备好了。但是,在这种情况下,您不太可能希望
重塑

. 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个观测值的方法。除了最小值和最大值外,我们使用的规则是保持“低中位数”,即当观察次数为偶数时,中位数的两个平均值中的较低值,否则保持中位数的单个值。(用斯蒂芬·斯蒂格勒(Stephen Stigler)令人愉快的术语,我们可以在第一种情况下谈论“喜剧演员”。)


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

当然,我很傻,我没想到这可能是一个中等问题,观察次数为偶数!不幸的是,我无法使用您的解决方案,因为我需要确定与这些值对应的观察值。有没有一种优雅的方法可以让我从下面选择最接近中间值的观察值作为中间值?我将扩展我的答案。
. 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 |
     +-----+