A Stata 11-ben a rowmedian függvény lehetővé teszi a sormediánok közvetlen kiszámítását az egen segítségével.
Hogyan számolhatok sormediánokat?
Title | Calculating row medians | |
Author | Nicholas J. Cox, Durham University |
A mediánok kiszámításának olyan statisztikai szoftverekben, mint a Stata, egyszerűnek kellene lennie, és általában az is. Amikor egy sormediánt akarunk – egy mediánt a megfigyeléseken belül több azonos típusú változóra vonatkozóan -, az bonyolultabbnak tűnik.
Ez a probléma megér némi vitát, és nem csak azért, mert a gyakorlatban felmerül. Egy kis példát is ad a Stata különböző részeinek működésére.
Az alapokat összefoglalva: ha egy változó mediánját akarjuk, akkor rendezhetünk az adott változóra, és kiválaszthatjuk magunknak a mediánt. Némi óvatosságra van szükség, ha csak a megfigyelések egy része érdekli, vagy ha hiányzó értékek vannak. A felhasználók többnyire az summarize, detail parancsot indítják el, amely gondoskodik minden ilyen kérdésről, és azonosítja a mediánt az eredményeken belül. Ezután azonnal a memóriában marad r(p50).
Ha ehelyett a mediánt egy változóba akarja helyezni, használhatja az egen, median() parancsot. Ennek akkor van a legtöbb értelme, ha az adataink csoportokra vannak osztva, és azt szeretnénk, hogy az egyes csoportok mediánja rögzítésre kerüljön későbbi felhasználás céljából. Ezért használhatod az egen, median() és a by: együtt.
Ha egy csomó azonos típusú változóval rendelkezel, néha van egy egyszerű válasz. Ha ezek a változók valóban panel- vagy longitudinális adatok, akkor át kell alakítania a longot, és más adatszerkezettel kell dolgoznia. Az élet így sokkal könnyebb lesz, nem csak a sormediánok esetében, amelyek most már csak panel mediánok, hanem szinte mindenféle elemzéshez, amit ilyen adatokkal akarsz csinálni.
Ha tudjuk, hogy a sorváltozóink értékei számsorrendben vannak, tehát például y1 mindig kisebb vagy egyenlő y2-vel, ami viszont kisebb vagy egyenlő y3-mal, és így tovább, akkor a medián közvetlenül kiszámítható vagy az egyik változóként, vagy két változó átlagaként, attól függően, hogy a változók száma páratlan vagy páros. De ezt elrontaná minden hiányzó érték.
Ezt a helyzetet a sorváltozók számsorrendben történő sorba állításával érhetjük el az SSC rowsort (Stata 8 szükséges; csak egész számokkal működik) vagy az SSC sortrows (Stata 9 szükséges) segítségével.
Ezután jönnek azok a helyzetek, amikor kevés változó van (kettő, három vagy négy), amelyek felett a sormediánt akarjuk venni – és ismét nem hiányoznak értékek. Két változó mediánja megegyezik az átlagukkal, így ez az első eset egyszerű:
. gen median = (y1 + y2) / 2
Egy kevésbé ismert trükk három változó esetén szintén egyszerűvé teszi a feladat megoldását:
. gen median = y1 + y2 + y3 - min(y1, y2, y3) - max(y1, y2, y3)
Szavakkal: számítsuk ki a sorösszegét; majd vonjuk ki a minimumot és a maximumot. Ami megmarad, az kell, hogy legyen a medián.
Most rögtön következik egy trükk négy változóra:
. gen median = (y1 + y2 + y3 + y4 - /// min(y1, y2, y3, y4) - max(y1, y2, y3, y4)) / 2
Szavakkal: számold ki a sorok összegét; majd vond ki a minimumot és a maximumot. Ami megmarad, az a két belső érték összege, és a felezés adja a mediánt.
Öt vagy több változóra egyszerű trükkök, általában, nem jelennek meg.
Némi gondolkodás azt mutatja, hogy a döntetlenek nem jelentenek problémát egyik ilyen trükknek sem. A kényelmetlenebb feltételezés az, hogy nem hiányoznak értékek. Van némi lehetőség a hiányzó értékekkel kapcsolatos problémák megmentésére. A hiányzó értékek számát kiszámíthatjuk
. egen nmissing = rowmiss(varlist)
segítségével, de néhány változó esetén a hiányzó változók menet közbeni számolása is ugyanilyen egyszerű.
Bármely hiányzó változó esetén a kettő mediánja megmenthető
. gen median = (y1 + y2) / 2 . replace median = max(y1, y2) if median == .
Ez a parancssorozat kihasználja, hogy a max(y1, y2) nem hiányzik, ha az egyik érték az. Ha mindkét érték hiányzik, akkor sem veszítünk igazán, hiszen néhány hiányzó értéket egyszerűen felülírnak a hiányzó értékek. Írhatnánk min(y1, y2), ha így kényelmesebbnek éreznénk. (Miért ugyanaz az eredmény?)
Hasonlóképpen megmenthető a három mediánja is.
. gen median = y1 + y2 + y3 - min(y1, y2, y3) - max(y1, y2, y3)
Ha y1, y2 és y3 mind hiányzik, akkor máris megvan az egyetlen lehetséges válasz: hiányzik. A javítandó helyzetek az, hogy csak egy változó hiányzik, és az, hogy minden megfigyelésből két változó hiányzik.
. replace median = max(y1, y2, y3) if (missing(y1) + missing(y2) + missing(y3)) == 2
Ha két változó hiányzik, akkor a másik változót a max()-ból megkapjuk, és az automatikusan a medián lesz.
. replace median = ( /// cond(missing(y1), 0, y1) + /// cond(missing(y2), 0, y2) + /// cond(missing(y3), 0, y3) ) / 2 /// if (missing(y1) + missing(y2) + missing(y3)) == 1
Ha egy változó hiányzik, akkor a másik kettő átlaga adja a mediánt. Biztosítjuk, hogy a hiányzó értékeket figyelmen kívül hagyjuk az összegben, ha helyette 0-t használunk. Ha tudnánk, hogy minden változónak pozitívnak (vagy nullának) kell lennie, akkor a cond(missing(y1), 0, y1) helyett használhatnánk olyan kifejezéseket, mint a max(y1, 0), és ha tudnánk, hogy minden változónak negatívnak (vagy nullának) kell lennie, akkor a min(y1, 0) helyett használhatnánk. Továbbá ugyanezt megtehetnénk az egen segítségével is:
. egen rowsum = rowsum(y1 y2 y3). replace median = rowsum / 2 ///if (missing(y1) + missing(y2) + missing(y3)) == 1
Nyilvánvaló, hogy bár az eddigi kódnak van némi kuriózumértéke, mert megmutatja, hogy nem mindig kell rendezni ahhoz, hogy sormediánokat kapjunk, valóban szükségünk van egy szisztematikusabb megközelítést megtestesítő programra.
Azonban nincs hivatalos egen függvény a sormediánokhoz. Ha megkeressük a közösség által nyújtott függvényeket, és alaposan megnézzük őket, akkor kezdhetjük látni, hogy miért. Lényegében két megközelítés volt lehetséges a Stata 9 előtt.
Az első, az egen-ben megvalósított rmed() az STB-57-ből (Stata 5 szükséges), az, hogy végighaladunk a megfigyeléseken, átmásoljuk az értékeket egy változóba, majd megkapjuk a mediánt. Sajnos ez a megközelítés feltételezi, hogy az érintett változók száma nem nagyobb, mint a megfigyelések száma. Ez általában, de nem feltétlenül igaz. Ennél is fontosabb, hogy ez a megközelítés valóban lassú lehet.
A második, az egen-ben megvalósított rmedf() az SSC-ből (Stata 6 szükséges), az adathalmaz menet közbeni átstrukturálása, mediánok kiszámítása, majd visszaalakítása. Vitatható, hogy egy adathalmaz átstrukturálása nem olyasmi, amit egy egen függvény közepén kellene elvégezni, de mindenesetre ez a megközelítés könnyen kudarcot vallhat, ha nem áll rendelkezésre elég memória.
A Stata 9-cel azonban egy pozitívabb lehetőség is adódik: a Mata használata. Az SSC-n található egenmore csomag tartalmazza az egen, rowmedian() funkciót. Ez sokkal gyorsabb, mint a korábbi egen függvények – bár az alaphurok még mindig egy ciklus a megfigyelések felett -, és kevés extra memóriát igényel. Íme a kód:
program _growmedian version 9 gettoken type 0 : 0 gettoken h 0 : 0 gettoken eqs 0 : 0 syntax varlist(numeric) if `"`by'"' != "" { _egennoby rowmedian() `"`by'"' /* NOTREACHED */ } marksample touse, novarlist quietly { mata : row_median("`varlist'", "`touse'", "`h'", "`type'") } end mata : void row_median(string scalar varnames, string scalar tousename, string scalar medianname, string scalar type) { real matrix y real colvector median, row real scalar n st_view(y, ., tokens(varnames), tousename) median = J(rows(y), 1, .) for(i = 1; i