Stata:仅保留给定变量的最小值,最大值和中值的观察值
Stata: Keep only observations with minimum, maximum and median value of a given variable
在 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 不在数据中。这很常见;事实上,这正是所有值不同且观察次数偶数的预期结果。
可能会出现其他问题,因为最小值、中值和最大值中的两个甚至三个可能彼此相等。这不是您当前的问题,但它可能会影响其他变量(例如指示变量)。
精度问题是可能的。
这是一个旨在避免所有这些困难的通用解决方案。
如果你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)
。
在 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 不在数据中。这很常见;事实上,这正是所有值不同且观察次数偶数的预期结果。
可能会出现其他问题,因为最小值、中值和最大值中的两个甚至三个可能彼此相等。这不是您当前的问题,但它可能会影响其他变量(例如指示变量)。
精度问题是可能的。
这是一个旨在避免所有这些困难的通用解决方案。
如果你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)
。