Stata 11:ssä funktio rowmedian mahdollistaa rivimediaanien laskemisen suoraan egenin avulla.
Miten lasken rivimediaanit?
Title | Rivimediaanien laskeminen | |
Author | Nicholas J. Cox, Durhamin yliopisto |
Mediaanien laskemisen tilasto-ohjelmassa, kuten Statassa, pitäisi olla helppoa, ja yleensä se onkin. Kun halutaan rivimediania – mediaani useiden samantyyppisten muuttujien havaintojen sisällä – se vaikuttaa hankalammalta.
Tämä ongelma on jonkinlaisen keskustelun arvoinen, eikä vain siksi, että se ilmenee käytännössä. Se tarjoaa myös pienen esimerkin Statan eri osien toiminnasta.
Kerrataan perusasiat: jos haluat jonkin muuttujan mediaanin, voit lajitella kyseisen muuttujan ja poimia mediaanin itse. Hieman varovaisuutta tarvitaan aina, kun olet kiinnostunut vain osasta havainnoista tai kun on puuttuvia arvoja. Useimmiten käyttäjät käyttävät summarize, detail -toimintoa, joka huolehtii kaikista tällaisista asioista ja tunnistaa mediaanin tuloksista. Se jää sitten heti muistiin muodossa r(p50).
Jos sen sijaan haluat laittaa mediaanin muuttujaan, voit käyttää egen, median(). Tämä on järkevintä silloin, kun aineistosi on jaettu ryhmiin ja haluat, että kunkin ryhmän mediaani tallennetaan myöhempää käyttöä varten. Käytät siis egen, median() yhdessä by::n kanssa.
Kun sinulla on joukko samantyyppisiä muuttujia, joskus vastaus on helppo. Jos nuo muuttujat ovat todella paneeli- tai pitkittäisaineistoa, sinun pitäisi muotoilla long uudelleen ja työskennellä eri tietorakenteella. Elämä on siten paljon helpompaa, ei ainoastaan rivien mediaaneille, jotka ovat nyt vain paneelimedioita, vaan myös lähes kaikenlaisille analyyseille, joita saatat haluta tehdä tällaisilla aineistoilla.
Jos tiedät, että rivimuuttujiesi arvot ovat numerojärjestyksessä, niin että esimerkiksi y1 on aina pienempi tai yhtä suuri kuin y2, joka puolestaan on pienempi tai yhtä suuri kuin y3 ja niin edelleen, niin mediaani voidaan laskea suoraan joko yhden muuttujan tai kahden muuttujan keskiarvona riippuen siitä, onko muuttujien lukumäärä pariton vai parillinen. Mutta tämä menisi sekaisin kaikkien puuttuvien arvojen takia.
Voit päästä tuohon tilanteeseen, jossa rivimuuttujat ovat numerojärjestyksessä, käyttämällä rowsort-ohjelmaa SSC:stä (vaatii Stata 8:n; toimii vain kokonaislukuarvoilla) tai sortrows-ohjelmaa SSC:stä (vaatii Stata 9:n).
Seuraavaksi tulevat tilanteet, joissa sinulla on vain vähän muuttujia (kaksi, kolme tai neljä), joiden yli haluat ottaa rivin mediaaniluvun – ja taaskaan mitään arvoja ei puutu. Kahden muuttujan mediaani on sama kuin niiden keskiarvo, joten tämä ensimmäinen tapaus on helppo:
. gen median = (y1 + y2) / 2
Kolmen muuttujan kohdalla vähemmän tunnettu kikka tekee myös ongelman ratkaisemisesta yksinkertaista:
. gen median = y1 + y2 + y3 - min(y1, y2, y3) - max(y1, y2, y3)
Sanalla sanoen: laske rivisumma; vähennä sitten minimi ja maksimi. Jäljelle jää vain mediaani.
Nyt temppu neljälle muuttujalle on välitön:
. gen median = (y1 + y2 + y3 + y4 - /// min(y1, y2, y3, y4) - max(y1, y2, y3, y4)) / 2
Sanoin: laske rivisumma; vähennä sitten minimi ja maksimi. Jäljelle jää kahden sisemmän arvon summa, ja puolittamalla saadaan mediaani.
Yksinkertaisia temppuja viidelle tai useammalle muuttujalle ei yleensä löydy.
Hieman miettimällä selviää, että tasapelit eivät ole ongelma yhdellekään näistä tempuista. Hankalampi oletus on, että mitään arvoja ei puutu. On olemassa jonkin verran mahdollisuuksia pelastaa ongelmia puuttuvien arvojen kanssa. Puuttuvien lukumäärän voi laskea
. egen nmissing = rowmiss(varlist)
, mutta muutaman muuttujan kohdalla puuttuvien muuttujien laskeminen lennosta on yhtä helppoa.
Kun puuttuvia muuttujia on yhtään, kahden mediaani voidaan pelastaa
. gen median = (y1 + y2) / 2 . replace median = max(y1, y2) if median == .
Tämä komentosarja käyttää hyväkseen sitä tosiasiaa, että max(y1, y2) on ei-puuttuva aina, kun jompikumpi arvo on. Jos molemmat arvot puuttuvat, emme oikeastaan menetä mitään, koska jotkut puuttuvat arvot vain korvataan puuttuvilla arvoilla. Voisit kirjoittaa min(y1, y2), jos se tuntuisi mukavammalta. (Miksi tulos on sama?)
Vastaavasti kolmen mediaani voidaan pelastaa.
. gen median = y1 + y2 + y3 - min(y1, y2, y3) - max(y1, y2, y3)
Jos y1, y2 ja y3 puuttuvat kaikki, sinulla on jo ainoa mahdollinen vastaus: puuttuu. Korjattavia tilanteita ovat, että vain yksi muuttuja puuttuu ja että kaksi muuttujaa puuttuu jokaisesta havainnosta.
. replace median = max(y1, y2, y3) if (missing(y1) + missing(y2) + missing(y3)) == 2
Jos kaksi muuttujaa puuttuu, niin voimme saada toisen muuttujan max()-funktiosta ja se on automaattisesti mediaani.
. 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
Jos yksi muuttuja puuttuu, niin kahden muun muuttujan keskiarvo antaa mediaanin. Varmistamme, että puuttuvat muuttujat jätetään huomiotta summassa käyttämällä sen sijaan 0:ta. Jos tietäisimme, että kaikkien muuttujien pitäisi olla positiivisia (tai nolla), voisimme käyttää termejä kuten max(y1, 0) eikä termejä kuten cond(missing(y1), 0, y1), ja jos tietäisimme, että kaikkien muuttujien pitäisi olla negatiivisia (tai nolla), voisimme käyttää sen sijaan min(y1, 0). Edelleen, voisit tehdä saman asian egen:
. egen rowsum = rowsum(y1 y2 y3). replace median = rowsum / 2 ///if (missing(y1) + missing(y2) + missing(y3)) == 1
Ilmeisesti, vaikka tähänastisella koodilla on jonkin verran kuriositeettiarvoa osoittaessaan, ettei aina tarvitse lajitella saadaksesi rivien mediaaneja, tarvitsemme todella ohjelman, joka ilmentää systemaattisempaa lähestymistapaa.
Rivien mediaaneja varten ei kuitenkaan ole olemassa virallista egen-funktiota. Jos etsit yhteisön tarjoamia funktioita ja tarkastelet niitä huolellisesti, voit alkaa ymmärtää miksi. Pohjimmiltaan kaksi lähestymistapaa oli mahdollista ennen Stata 9:ää.
Ensimmäinen, joka on toteutettu egen:ssä, rmed()-funktio STB-57:stä (Stata 5 vaaditaan), on se, että silmukoidaan havaintojen yli, kopioidaan arvot muuttujaan ja saadaan sitten mediaani. Valitettavasti tämä lähestymistapa olettaa, että kyseisten muuttujien määrä ei ole suurempi kuin havaintojen määrä. Tämä on yleensä mutta ei välttämättä totta. Vielä tärkeämpää on, että tämä lähestymistapa voi olla todella hidas.
Toinen, joka on toteutettu egen:ssä, rmedf() SSC:stä (Stata 6 vaaditaan), on jäsentää tietokokonaisuus uudelleen lennossa, laskea mediaanit ja sitten jäsentää uudelleen takaisin. Kiistatta datasetin uudelleenjärjestelyä ei pitäisi tehdä kesken egen-funktion, mutta joka tapauksessa tämä lähestymistapa voisi helposti epäonnistua, jos muistia ei olisi tarpeeksi.
Stata 9:n myötä tulee kuitenkin positiivisempi mahdollisuus: käyttää Mata. SSC:n paketti egenmore sisältää egen, rowmedian(). Se on paljon nopeampi kuin aiemmat egen-funktiot – vaikka perussilmukka on edelleen silmukka havaintojen yli – ja se vaatii vähän ylimääräistä muistia. Tässä on koodi:
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