Jak mogę zrobić wykres słupkowy z paskami błędów? | Stata FAQ
Przypuszczam, że patrzyłeś na wyniki pisania z podziałem na rasę i ses. Można by chcieć wykreślić średnią i przedział ufności dla każdej grupy używając wykresu słupkowego z paskami błędów, jak pokazano poniżej. Ten FAQ pokazuje jak można zrobić taki wykres, budując go krok po kroku.
Image barcap1
Po pierwsze, pobierzmy plik z danymi, którego będziemy używać.
use https://stats.idre.ucla.edu/stat/stata/notes/hsb2, clear
Następnie użyjmy polecenia collapse, aby średnia i odchylenie standardowe stały się byrace i ses.
collapse (mean) meanwrite= write (sd) sdwrite=write (count) n=write, by(race ses)
Teraz stwórzmy górną i dolną wartość przedziału ufności.
generate hiwrite = meanwrite + invttail(n-1,0.025)*(sdwrite / sqrt(n))generate lowrite = meanwrite - invttail(n-1,0.025)*(sdwrite / sqrt(n))
Teraz jesteśmy gotowi do wykonania wykresu słupkowego danych Polecenie graph bar tworzy całkiem dobry wykres słupkowy.
graph bar meanwrite, over(race) over(ses)Image barcap2
Możemy sprawić, by wykres wyglądał nieco ładniej, dodając opcję asyvars, jak pokazano poniżej.
graph bar meanwrite, over(race) over(ses) asyvarsImage barcap3
Ale ten wykres nie posiada pasków błędów. Niestety, tak jak ładne jest polecenie graph bar, nie pozwala ono na stosowanie pasków błędów. Możemy jednak utworzyć wykres dwukierunkowy, który ma paski błędów, jak pokazano poniżej. Niestety, ten wykres nie jest tak atrakcyjny jak wykres z polecenia graph bar.
graph twoway (bar meanwrite race) (rcap hiwrite lowrite race), by(ses)Image barcap4
Mamy więc problem. Polecenie graph bar zrobi piękny wykres słupkowy, ale nie będzie obsługiwać pasków błędów. Polecenie twoway bar tworzy piękne paski błędów, ale nie przypomina ładnego wykresu, który lubiliśmy z polecenia graph bar. Możemy jednak dopracować polecenie twoway bar, aby uzyskać wykres, który przypomina polecenie graph bar, a następnie połączyć go z paskami błędów. Oto proces krok po kroku.
Po pierwsze, stworzymy zmienną sesrace, która będzie pojedynczą zmienną zawierającą informacje o sesji i rasie. Zauważ jak sesrace ma lukę pomiędzy poziomami ses (na 5 i 10).
generate sesrace = race if ses == 1replace sesrace = race+5 if ses == 2replace sesrace = race+10 if ses == 3sort sesracelist sesrace ses race, sepby(ses) +---------------------------------+ | sesrace ses race | |---------------------------------| 1. | 1 low hispanic | 2. | 2 low asian | 3. | 3 low african-amer | 4. | 4 low white | |---------------------------------| 5. | 6 middle hispanic | 6. | 7 middle asian | 7. | 8 middle african-amer | 8. | 9 middle white | |---------------------------------| 9. | 11 high hispanic | 10. | 12 high asian | 11. | 13 high african-amer | 12. | 14 high white | +---------------------------------+
Teraz zrobimy wykres używając graph twoway. Zauważ, że słupki są w trzech grupach po cztery słupki. Trzy grupy odpowiadają trzem poziomom sesji, a cztery paski w każdej grupie odpowiadają czterem poziomom rasy. Możesz odnieść to grupowanie do sposobu, w jaki skonstruowaliśmy rasy powyżej.
twoway (bar meanwrite sesrace)Image barcap5
Możemy teraz nałożyć słupki błędów poprzez nałożenie wykres rcap
twoway (bar meanwrite sesrace) (rcap hiwrite lowrite sesrace)Image barcap6
To w pewnym sensie wygląda jak to, czego chcemy, ale wyglądałoby to ładniej, gdyby każdy z pasków dla czterech różnych ras był w innym kolorze. Możemy to zrobić, nakładając cztery osobne wykresy słupkowe, po jednym dla każdej grupy rasowej.
twoway (bar meanwrite sesrace if race==1) /// (bar meanwrite sesrace if race==2) /// (bar meanwrite sesrace if race==3) /// (bar meanwrite sesrace if race==4) /// (rcap hiwrite lowrite sesrace)Image barcap7To wygląda lepiej, ale użyjmy legendy, aby lepiej oznaczyć słupki.
twoway (bar meanwrite sesrace if race==1) /// (bar meanwrite sesrace if race==2) /// (bar meanwrite sesrace if race==3) /// (bar meanwrite sesrace if race==4) /// (rcap hiwrite lowrite sesrace), /// legend( order(1 "Hispanic" 2 "Asian" 3 "Black" 4 "White") )Image barcap8
Legenda ładnie etykietuje słupki, ale wyglądałaby czyściej, gdyby był to tylko jeden rząd, a oś x wykresu nie przekazuje, że trzy grupy pasków odpowiadają trzem grupom sesji. Możemy użyć opcji xlabel(), aby temu zaradzić. Dodamy również lepsze tytuły dla osix i y.
twoway (bar meanwrite sesrace if race==1) /// (bar meanwrite sesrace if race==2) /// (bar meanwrite sesrace if race==3) /// (bar meanwrite sesrace if race==4) /// (rcap hiwrite lowrite sesrace), /// legend(row(1) order(1 "Hispanic" 2 "Asian" 3 "Black" 4 "White") ) /// xlabel( 2.5 "Low" 7.5 "Middle" 12.5 "High", noticks) /// xtitle("Socio Economic Status") ytitle("Mean Writing Score")Image barcap9
Teraz mamy wykres, który wygląda jak wykres, który otrzymalibyśmy z graph bar, ale przez dopracowanie graph twoway bar do stworzenia tego ładnego wykresu, moglibyśmy następnie nałożyć wykres rbar, aby uzyskać paski błędów, które chcieliśmy.