これは、データセットを分割しないでこれを行う方法の1つです。落とす観察を特定するタスクは、すべてのペアごとの比較を行うためにダブルループを必要とします。しかし、Stataには、わずかな変数の観測を削除するコマンドはありません。次の例では、私が保存してから値をクリアし、Stataの変数に戻し観測を保存するために観測をロードするためにマタに切り替える:また
clear
set obs 100
generate var1 = rnormal()
generate var2 = rnormal()
input double(id var5 var6)
1 1052 17.348
2 1288 17.378
3 1536 17.387
4 2028 17.396
5 1810 17.402
6 2034 17.407
end
* an observation index
gen obsid = _n if !mi(id)
* identify observations to drop
gen todrop = 0 if !mi(id)
sum obsid, meanonly
local n = r(N)
quietly forvalues i = 1/`n' {
forvalues j = 1/`n' {
replace id = . if var5[`i'] > var5[`j'] & var6[`i'] < var6[`j'] & _n == `i'
}
}
* take a trip to Mata to load the data to keep and store it back from there
mata:
// load data, ignore observations with missing values
X = st_data(., ("id","var5","var6"), 0)
// set all obs to missing
st_store(., ("id","var5","var6") ,J(st_nobs(),3,.))
// store non-missing values back into the variables
st_store((1,rows(X)), ("id","var5","var6") ,X)
end
drop obsid todrop
、手動でいくつかの観測インデックスを実行して値を上に移動することができます体操:
clear
set obs 100
generate var1 = rnormal()
generate var2 = rnormal()
input double(id var5 var6)
1 1052 17.348
2 1288 17.378
3 1536 17.387
4 2028 17.396
5 1810 17.402
6 2034 17.407
end
* an observation index
gen obsid = _n if !mi(id)
* identify observations to drop
gen todrop = 0 if !mi(id)
sum obsid, meanonly
local n = r(N)
quietly forvalues i = 1/`n' {
forvalues j = 1/`n' {
replace id = . if var5[`i'] > var5[`j'] & var6[`i'] < var6[`j'] & _n == `i'
}
}
* move observations up
local j 0
quietly forvalues i = 1/`n' {
if !mi(id[`i']) {
local ++j
replace id = id[`i'] in `j'
replace var5 = var5[`i'] in `j'
replace var6 = var6[`i'] in `j'
}
}
local ++j
replace id = . in `j'/l
replace var5 = . in `j'/l
replace var6 = . in `j'/l
drop obsid todrop
あなたの判断基準を定義しますか?この例では、ドロップされた観測値はvar5の最小値であり、負のvar6を持つ唯一のobsです。あなたが作ろうとしている他の観測(ids)との比較は何ですか?ドロップしたい他のいくつかのIDを使用して、あなたの例を拡張することを検討してください。 – lmo
'var5の値が大きくなり、var6の値が他の少なくとも1つの値よりも小さくなっています。 'それは私には分かりません –
' var5> min(var1、var2)&var6
ChrisP