Statystyka i Analiza danych

Laboratorium 4 - Estymatory

Ćwiczenie 1: Badanie obciążenia estymatorów średniej i wariancji

Na początku utworzymy populację, losując 1000 liczb z rozkładu jednostajnego:

In [1]:
r_populacji  <- 1000
populacja  <- runif(r_populacji, 5, 17)
?apply

Następnie wygenerujemy 200 prób o rozmiarze 15:

In [2]:
r_proby  <- 15
l_prob  <- 200
losowe_indeksy  <- sample(1:r_populacji, size=r_proby*l_prob, replace=TRUE)
proby  <- matrix(populacja[losowe_indeksy], r_proby, l_prob)
colnames(proby)  <- paste(rep("próba",ncol(proby)),c(1:ncol(proby)))
proby
A matrix: 15 × 200 of type dbl
próba 1próba 2próba 3próba 4próba 5próba 6próba 7próba 8próba 9próba 10⋯próba 191próba 192próba 193próba 194próba 195próba 196próba 197próba 198próba 199próba 200
5.090473 9.53116211.07720911.924562 5.040818 6.30608910.84295413.525753 5.15765313.784876⋯ 9.661226 6.224754 9.998815 9.23924615.12086815.43913913.990314 7.289556 9.65569711.425884
11.077209 9.44103610.94489912.10577913.63080115.120868 7.328965 8.23614910.21786910.489796⋯ 5.824588 9.765745 7.28387610.043012 5.92354915.588200 7.50633913.690954 7.68709713.525753
10.349103 5.55934514.611807 9.671344 7.35408212.353102 5.85421816.27201511.52842812.370039⋯13.24419414.810264 6.186335 7.11137212.59688213.835927 7.27937116.28097312.331548 9.938966
6.418535 7.980613 6.11591110.35733210.34179816.30592214.45916215.43913916.94535414.805233⋯16.63524115.93675314.15704210.52886612.60208110.93020813.938115 6.02169311.75944812.146143
16.016287 9.447859 6.62925313.571826 7.50633911.22585614.09764515.66980310.18981610.422228⋯ 7.214923 9.700113 6.00048312.05447411.42588415.27457016.17217211.49490910.707435 9.118485
7.40610816.33047210.146011 5.941490 7.290848 5.157653 9.07845516.574774 6.590717 5.260609⋯16.53826110.86179414.80523313.98936313.647917 9.87207313.770284 9.719851 9.10590212.233143
10.780204 7.64395612.973730 6.39357411.19947814.96507611.63630610.602594 6.13589016.537157⋯ 5.900257 7.41260412.40220013.262756 7.589483 8.015120 8.410068 9.95709416.669534 7.455637
5.346186 5.595429 8.215567 9.998815 6.686075 9.47939910.120026 8.348883 7.41268010.697079⋯12.075405 5.04729812.81733615.120868 6.881843 7.83867513.00359214.499703 7.68709715.780563
15.187118 5.65563115.27457015.653364 5.78551814.85268913.53683714.467451 8.421974 5.783551⋯ 9.63050111.213953 6.20398414.867456 7.41268016.669534 9.873249 7.47613414.867456 9.408196
13.201861 8.34888313.05140810.17710411.534080 6.972079 8.866915 7.20656114.86745613.990314⋯10.048746 7.500733 9.990852 5.55934513.86756910.654791 7.85457112.68915812.35310214.947872
15.21859314.96507615.816933 7.98061313.525753 9.54347916.758515 7.29084811.07373815.392892⋯15.90609810.537789 6.86740010.944899 7.283876 6.48522012.88281211.922436 6.115911 7.880756
8.83620215.854265 7.33726611.81720914.389441 8.07546515.967813 5.70564812.80641414.433284⋯ 6.331958 7.216022 9.030761 8.67950114.67577711.83504712.78009914.91152115.08278312.683963
10.53778911.62675015.857039 9.44785914.983683 8.910531 9.44128315.936753 5.090473 5.833617⋯13.181710 9.441036 9.55606114.45958016.66953416.13967710.60259410.42028314.29458714.332387
15.39289215.99273615.36075714.86745615.881429 7.43535510.057399 9.348889 5.59542911.223218⋯13.676734 8.709660 8.98318611.37255415.16322116.083443 7.98061315.53834115.65700913.867569
9.265038 7.328965 7.363897 9.09386415.92503514.49518310.353527 8.007669 6.392426 9.013035⋯ 5.05413710.78904016.77159815.19152312.668991 6.95471413.30964911.20707610.72462714.651832

Oblicz statystyki opisowe dla populacji:

In [3]:
pop_var  <- function(data)
{
    mean((data - mean(data))^2)
}

opis_popul  <- c("średnia"=mean(populacja), "wariancja"=pop_var(populacja), "odchylenie standardowe"=sqrt(pop_var(populacja)))
opis_popul
średnia
11.0378580537951
wariancja
11.7866136515003
odchylenie standardowe
3.43316379619445

Dla każdej próby wyznacz estymator średniej, estymator wariancji oraz obciążoną wersję estymatora wariancji. Możesz użyć funkcji apply.

In [4]:
estymator_srednia  <- apply(proby, 2, mean)
estymator_wariancja  <- apply(proby, 2, var)
obciazony_estymator_wariancja  <- apply(proby, 2, pop_var)

Następnie dla każdego z estymatorów wyznacz wartość oczekiwaną (uśredniając po próbach) oraz obciążenie:

In [5]:
wiersze  <- c("Wartość oczekiwana", "Obciążenie")
kolumny  <- c("Estymator średnia", "Estymator wariancja", "Estymator obciążony wariancja")

wartosci_oczekiwane  <- c(mean(estymator_srednia), mean(estymator_wariancja), mean(obciazony_estymator_wariancja))  
obciazenia  <- c(wartosci_oczekiwane[1]-opis_popul[1], wartosci_oczekiwane[2]-opis_popul[2], wartosci_oczekiwane[3]-opis_popul[2])

matrix(c(rbind(wartosci_oczekiwane, obciazenia)), length(wiersze), length(kolumny), dimnames=list(wiersze, kolumny))
A matrix: 2 × 3 of type dbl
Estymator średniaEstymator wariancjaEstymator obciążony wariancja
Wartość oczekiwana11.1110773211.8469400411.0571440
Obciążenie 0.07321926 0.06032639-0.7294696

Dla estymatora wartości średniej policz dodatkowo odchylenie standardowe i teoretyczne odchylenie standardowe:

In [6]:
c("Odchylenie standardowe"=sd(estymator_srednia),"Teoretyczne"=opis_popul[3]/sqrt(r_proby))
Odchylenie standardowe
0.917879213784969
Teoretyczne.odchylenie standardowe
0.886439080497555

Utwórz histogram wartości estymatora średniej:

In [7]:
hist(estymator_srednia, main="Estymator średnia", xlab="Wartość estymatora")

Ćwiczenie 2: Badanie estymacji przedziałowej.

Na początek wygenerujemy 200 prób o rozmiarze 20 z rozkładu normalnego.

In [8]:
r_proby  <- 15
l_prob  <- 200
m  <- 0
sigma  <- 1

proby  <- matrix(rnorm(r_proby*l_prob, m, sigma), r_proby, l_prob)
colnames(proby)  <- paste(rep("próba",ncol(proby)),c(1:ncol(proby)))
proby
A matrix: 15 × 200 of type dbl
próba 1próba 2próba 3próba 4próba 5próba 6próba 7próba 8próba 9próba 10⋯próba 191próba 192próba 193próba 194próba 195próba 196próba 197próba 198próba 199próba 200
-0.0403578-0.41816814 0.3961205-1.24030628 1.39457080 0.3649616 0.4577070 0.42259796-0.02573978 0.19466798⋯ 1.13863100-0.85928447 1.6174110 0.6887837 0.53246988-1.5812012 1.41578954 0.74318130 0.85513974 1.0736531
-1.2480173-0.67189550 0.2505117-0.13510912 0.36899385 0.8008948-0.8672830 2.36558336 0.82911507-1.01277911⋯-0.32405786-0.08076494 1.3451022 0.6145162-0.14427005-0.9166912 0.14728451-0.56793863 1.37617476-0.7422623
0.1452996 0.31472500-0.1248435 1.66233522-0.04645893-1.4343928-0.2689670 0.11887111-1.41655233 0.99680734⋯-1.26053098-0.95847386-0.9205454-1.2780035-0.82999361 1.9164306-0.06903364-0.08113482-0.50092190-0.6281162
0.6169853-0.95671998-2.3410437-0.51757929 0.87569727-0.9056770-0.7564520 0.76245439 1.41028008 0.06801464⋯-0.31991924 1.21416019 0.2545204 0.5609322 0.42835233-0.9787191-1.31823845-1.01492502 0.37794165-0.2440886
0.3707519 0.13742174 1.0084633 0.79872859 1.00090393-2.2002530 1.5138453 0.61837680 0.33591101 0.42138373⋯ 0.90123467 0.68238865-1.0294719 0.1473079-0.71714051 1.5748465-1.32422825-1.16840528 1.45646314 0.8256243
-0.7297799 0.01600482-0.8971800 0.09951399 1.09734292 0.6545646 0.9289258 0.65596073-1.77044843 2.29431698⋯ 0.50590145-0.73352465-1.1173295-0.4017463 0.68321458-0.8745530 1.06782528 0.36681272-0.71536971 0.2117687
0.4664910 0.03879302-0.2449688-0.92304831 2.09242640 0.3792123 0.9631270-1.15593068 0.50841947-0.98092244⋯-0.34307909 0.01056142 0.8545278 1.4515137 0.09038523 0.7956648-0.78697520 0.46383152-0.11453222-0.5919392
0.4083881 1.17395350-0.1469648 0.43258669 0.18886979-0.4777084 0.5648038-0.48795792-0.85014503 0.95284852⋯-0.09472571 0.64250341 0.4340741 0.7838183-1.08701247-2.7524565 1.70605357 1.02697713-0.08750955 1.7845503
0.6618600 0.40955642-0.7694962-1.75262567 0.57194913 0.5984569 0.1774345 0.02870057-0.05690697 0.84954575⋯ 0.05710091 1.64613744-0.9610007-1.2474082 1.53850265-1.0197699 1.37362860-0.60651187 1.07892693 1.5949356
-0.2946368 0.46100666-1.0754063 1.17522257-0.89498166-0.3764826 0.3006230-0.02762161-1.80077436 1.23524858⋯ 1.67244923-0.23607629 0.6970959 1.3764406-1.67781527 1.9149260 0.29773724 0.41141705 1.40105108 0.7397867
-0.6224272-1.77209491-0.2827670 1.03045667 0.17692054 0.4948358-1.4598398-0.63402192-0.94396604-0.33695650⋯ 2.12408876-1.65780593 1.0140805-1.7570023 0.19997784 1.5127600 1.01199258-0.22737471 0.85654507 1.2147040
-0.1700453 1.34313664-2.6529380 0.53645428 1.68965209-0.2726029 0.6795302 1.69804007-0.10296937 1.54001529⋯ 2.14914540 0.87606839-0.9173406 0.6120444-0.50455424 0.2112117-1.09224426 1.03640534 0.85293171 1.4079055
-0.4042395 0.72171377 0.6944428 0.06696101 1.15148264 0.1537419-2.2274933 0.43317433-0.34528715-1.49683498⋯ 0.69033035-1.36349102 0.4652611 1.0657573 0.53256494-0.1921526-1.01077471-0.12649158 0.57345863-1.1199691
-0.5353426 0.07408932 0.2623433 1.94108347-0.02142428-0.1626746-0.4511776-1.17403211-0.42914061 0.12207159⋯ 1.02122405-0.63842867 0.1101108-0.2521900 1.24535185 0.6066658 0.75141238-0.03084774-2.08231141-2.1581913
-0.6542361-0.41877875 0.2010662 1.09747790-0.44233834-0.1194830 1.3090253-0.25517374 0.83957447 0.59239513⋯ 0.87329986-0.40888854-0.5388210 0.1094405 1.18717125 0.2013147-1.71442459 0.48748352 0.43803738-1.1176331

Wyznacz kolejno dla każdej próby estymator średniej (możesz użyć funkcji apply), lewy i prawy koniec przedziału, szerokość przedziału oraz wypisz czy prawdziwa średnia znalazła się w przedziale.

In [9]:
poziom_istotnosci  <- 0.05
kwantyl  <- qnorm(1-poziom_istotnosci/2, m, sigma)

estymator_srednia  <- apply(proby, 2, mean)
l_koniec_przedzialu  <- estymator_srednia - kwantyl*sigma/sqrt(r_proby)
p_koniec_przedzialu  <- estymator_srednia + kwantyl*sigma/sqrt(r_proby)
szerokosc_przedzialu  <- p_koniec_przedzialu - l_koniec_przedzialu
czy_srednia_w_przedziale  <- (m > l_koniec_przedzialu) & (m < p_koniec_przedzialu)

round(matrix(c(rbind(estymator_srednia, l_koniec_przedzialu, p_koniec_przedzialu, szerokosc_przedzialu, czy_srednia_w_przedziale)), 5, l_prob, dimnames = list(c("Estymator średniej", "L koniec przedziału", "P koniec przedziału", "Szerokość przedziału", "Średnia w przedziale?"),colnames(proby))),3)
A matrix: 5 × 200 of type dbl
próba 1próba 2próba 3próba 4próba 5próba 6próba 7próba 8próba 9próba 10⋯próba 191próba 192próba 193próba 194próba 195próba 196próba 197próba 198próba 199próba 200
Estymator średniej-0.135 0.030-0.382 0.2850.614-0.167 0.058 0.225-0.255 0.363⋯0.586-0.124 0.087 0.165 0.098 0.028 0.030 0.047 0.384 0.150
L koniec przedziału-0.641-0.476-0.888-0.2210.108-0.673-0.448-0.281-0.761-0.143⋯0.080-0.630-0.419-0.341-0.408-0.478-0.476-0.459-0.122-0.356
P koniec przedziału 0.371 0.536 0.125 0.7911.120 0.339 0.564 0.731 0.251 0.869⋯1.092 0.382 0.593 0.671 0.605 0.534 0.536 0.554 0.890 0.656
Szerokość przedziału 1.012 1.012 1.012 1.0121.012 1.012 1.012 1.012 1.012 1.012⋯1.012 1.012 1.012 1.012 1.012 1.012 1.012 1.012 1.012 1.012
Średnia w przedziale? 1.000 1.000 1.000 1.0000.000 1.000 1.000 1.000 1.000 1.000⋯0.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000

Następnie wyznacz prawdopodobieństwo uśredniając po 200 próbach. Czy zmiana m i sigma wpływa na to prawdopodobieństwo?

In [10]:
c("Pr(średnia w przedziale)"=sum(czy_srednia_w_przedziale)/l_prob)
Pr(średnia w przedziale): 0.97

Ćwiczenie 3: Badanie zgodności estymatorów średniej i wariancji

Zacznij od wygenerowania n losowych liczb z rozkładu normalnego:

In [11]:
n  <- 1000
m  <- 0
sigma  <- 1

losowe  <- rnorm(n, m, sigma)

Wyznacz wartości estymatora średniej oraz wariancji i porównaj ją z prawdziwymi wartościami dla rosnącej ilości zmiennych (możesz użyć funkcji sample). Błąd przyjmij w sensie kwadratu różnicy między wartością prawdziwą a estymowaną.

In [12]:
estymatory  <- matrix(rep(0, (n-1)*4), n-1, 4, dimnames=list(1:(n-1),c("Średnia", "Wariancja", "Błąd średnia", "Błąd wariancja")))

for (i in (2:n))
{
    estymatory[i-1,"Åšrednia"]  <- mean(losowe[sample(1:n, i, replace=FALSE)])
    estymatory[i-1,"Wariancja"]  <- var(losowe[sample(1:n, i, replace=FALSE)])
}

estymatory[,"Błąd średnia"]  <- (estymatory[,"Średnia"] - m)^2
estymatory[,"BÅ‚Ä…d wariancja"]  <- (estymatory[,"Wariancja"] - sigma^2)^2

estymatory
A matrix: 999 × 4 of type dbl
ŚredniaWariancjaBłąd średniaBłąd wariancja
1-0.1051991330.58841121.106686e-021.694053e-01
2 0.2500609340.18969276.253047e-026.565979e-01
3 0.5958818030.61007813.550751e-011.520391e-01
4-0.0962320841.17513989.260614e-033.067396e-02
5 0.3962669720.37785031.570275e-013.870702e-01
6-0.4240304520.67838781.798018e-011.034344e-01
7-0.0042523651.16086851.808261e-052.587867e-02
8 0.2825656680.87937657.984336e-021.455003e-02
9-0.3786403431.56794361.433685e-013.225599e-01
10 0.0521651200.67374342.721200e-031.064434e-01
11 0.1018901680.47547111.038161e-022.751306e-01
12-0.3630404370.53038941.317984e-012.205341e-01
13-0.1502674530.66929622.258031e-021.093650e-01
14 0.2148410451.32191054.615667e-021.036264e-01
15 0.3117808900.23727749.720732e-025.817458e-01
16-0.1344391820.76229111.807389e-025.650552e-02
17 0.1498007200.96098342.244026e-021.522293e-03
18 0.0148820551.19866492.214756e-043.946776e-02
19-0.0169420921.00797692.870345e-046.363105e-05
20-0.2154112300.78951464.640200e-024.430412e-02
21-0.5390981490.82490282.906268e-013.065903e-02
22 0.0640594501.53127374.103613e-032.822517e-01
23 0.4603992141.02760022.119674e-017.617726e-04
24 0.1150596740.98492831.323873e-022.271551e-04
25-0.1438233631.17728222.068516e-023.142896e-02
26-0.0295644840.79135058.740587e-044.353462e-02
27 0.1300287810.78923701.690748e-024.442106e-02
28-0.1666863560.87177492.778434e-021.644167e-02
29 0.0271265110.94168627.358476e-043.400501e-03
30 0.0270228800.83352327.302360e-042.771454e-02
⋮⋮⋮⋮⋮
9700.032116940.97167840.00103149800.0008021158
9710.032926680.96747320.00108416610.0010579896
9720.035724900.97697270.00127626860.0005302555
9730.036138370.97665270.00130598190.0005450975
9740.034029610.95984500.00115801410.0016124243
9750.031875650.96706370.00101605710.0010847966
9760.040082580.96800270.00160661300.0010238281
9770.025189060.96614300.00063448870.0011462944
9780.039490270.97047430.00155948150.0008717696
9790.035640460.97083880.00127024220.0008503775
9800.033670960.96082240.00113373340.0015348840
9810.031587380.97425870.00099776270.0006626136
9820.026430600.97047840.00069857640.0008715270
9830.039596230.97323000.00156786150.0007166302
9840.035649720.97359510.00127090280.0006972178
9850.028678410.97346030.00082245100.0007043581
9860.026369320.97430490.00069534110.0006602402
9870.025109860.97054350.00063050530.0008676864
9880.033572240.96772430.00112709540.0010417207
9890.032825670.96702330.00107752480.0010874652
9900.030282840.97088610.00091705060.0008476170
9910.033928110.97084880.00115111640.0008497922
9920.032648810.97258800.00106594460.0007514167
9930.035613910.97385340.00126835070.0006836450
9940.027767380.97068650.00077102730.0008592812
9950.031800050.97026450.00101124340.0008841987
9960.033072250.97155610.00109377370.0008090541
9970.032789120.97076770.00107512610.0008545301
9980.033977410.96990100.00115446430.0009059518
9990.032959690.97000470.00108634130.0008997158
In [13]:
plot_estimate  <- function(data, estimate_name, error_name, plot_name, true_value)
{
    y_limits  <- c(min(0,min(data[,estimate_name])),max(max(data[,estimate_name]),max(data[,error_name])))
    plot(data[,estimate_name], t='l',col='blue', ylab="wartość", xlab="n", main=plot_name, ylim=(y_limits))
    lines(data[,error_name], col='red')
    abline(h=true_value, col='green')
    e_name  <- tolower(estimate_name)
    legend('topright', c(paste("Estymator",e_name), error_name, paste("Prawdziwa wartość",e_name)), lty=1, col=c('blue', 'red', 'green'))
}

Utwórz wykresy estymatora średniej oraz wariancji i ich błędu dla rosnącej liczby zmiennych. Skorzystaj z funkcji plot_estimate. Wykres dla estymatora średniej:

In [14]:
plot_estimate(estymatory, "Średnia", "Błąd średnia", "Estymator średniej", m)

Wykres dla estymatora wariancji:

In [15]:
plot_estimate(estymatory, "Wariancja", "BÅ‚Ä…d wariancja", "Estymator wariancji", sigma^2)