MAI061 cvičení 2
Z ωικι.matfyz.cz
###########################################################
##### 2. CVICENIE - 14.03.2007 ######
###########################################################
# Podrobnosti k cviceniu na mojej web stranke, na adrese:
# http://www.mmatthew.matfyz.cz/school.php
# Podrobnosti k prednaske na stranke Dr. Hlavku, na adrese:
# http://www.karlin.mff.cuni.cz/~hlavka
###########################################################
## ROZDELENIA, NAHODNY VYBER, ZAKLADNE CHARAKTERISTIKY ##
###########################################################
# # Normalni rozdeleni
rnorm(100) # generuje nahodny vyber o rozsahu 100 z N(0,1)
# hustota normalniho rozdeleni N(2,1) v bode 2
dnorm(2, mean = 2, sd = 1)
# Hodnota distribucni funkce rozdeleni N(2,1) v bode 2
pnorm(2, mean = 2, sd = 1)
# kvantil rozdeleni N(2,1) v bode 2
qnorm(2, mean = 2, sd = 1)
# # dalsi rozdeleni
# (rdpq)unif ... rovnomerne
# (rdpq)exp ... exponencialni
# (rdpq)t .... t-rozdeleni
# (rdpq)cauchy ... cauchyho rozdeleni
# (rdpq)f .... F-rozdeleni
# (rdpq)binom ... binomicke rozdeleni
# (rdpq)pois ... poissonovo rozdeleni
# Modelujme si rozdeleni IQ v populaci studentu MFF.
# O IQ se predpoklada, ze ma normalni rozdeleni
# se stredni hodnotou 115 a rozptylem 64. Pocet
# studentu MFF je 2000.
# # Normalni rozdeleni
mff <- rnorm(n = 2000, mean = 115, sd = 8);
# Pokud jsme to nepopletli, tak prumer by mel byt kolem 115
mean(mff)
# a rozptyl kolem 64
var(mff)
# Histogram by mel pripominat normalni rozdeleni
hist(mff, freq = FALSE);
# Prolozime teoretickou hustotou..
curve(dnorm(x,mean = 115, sd = 8), col="blue", add=TRUE);
# Pokud bychom neznali prikaz curve, mohli bychom
# postupovat nasledovne
# sit hodnot x, pro ktera chceme pocitat hustotou
grid <- seq(80,150,by= 0.1);
lines(x=grid, y = dnorm(grid,mean = 115, sd = 8), col="blue");
# # Otazka: Jake procento studentu MFF ma IQ vyssi nez 130?
# Simulacni reseni:
# 1.Generujeme si dostatecne velky vyber
N <- 1000000;
x <- rnorm(N, mean = 115, sd = 8);
# Podil studentu s IQ vyssim nez 130 pak spocteme jako
sum(x > 130)/N;
# 2.Teoreticke reseni
1-pnorm(130, mean = 115, sd = 8);
# Kazdy rok nahodne vybereme 100 studentu za ucelem
# odhadnuti prumerneho IQ (tj. chceme odhadnout
# teoreticke prumerne IQ, ktere je 115 a ktere nyni nezname).
# Je lepe pouzivat prumer ci median vyberu?
# Jak kvalitni jsou tyto odhady? Tj. jak dobre odhaduji 115?
# pocet opakovani
opak <- 1000;
# velikost vyberu
n <- 50
prumery <- rep(0, opak);
mediany <- rep(0, opak);
for(i in 1:opak){
# generujeme si nahodny vyber
x <- rnorm(50, mean = 115, sd = 8);
prumery[i] <- mean(x);
mediany[i] <- median(x);
}
# Ktery odhad se Vam zda vyhodnejsi pouzivat?
# Odhaduji tyto v prumeru odhady to, co maji odhadovat?
mean(prumery);
mean(mediany);
# A ktery z odhadu ma mensi rozptyl
var(...)
# Muzeme si take zkusit nakreslity histogramy
hist(prumery, freq = FALSE, breaks = 20)
hist(mediany, freq = FALSE, breaks = 20, add = TRUE, border = "blue")
# Prehlednejsi je ale asi si nakreslit "vyhlazene histogramy",
# tj. "jadrove odhady"
plot(density(prumery), main = "");
lines(density(mediany), col = "blue");
# # Porovnejme jeste studentyu z MFF a z CVUT.
# O rozdeleni IQ studentu z CVUT prepokladejme,
# ze je normalni se stredni hodnotu 110 a rozptylem 10.
curve(dnorm(x,mean=115,sd=8),from=80,140, lty=1, main="Hustoty rozdeleni IQ", xlab="IQ", ylab="Hustota f(x)")
curve(dnorm(x,mean=110,sd=10),lty=2,add=TRUE, col = "blue")
# a udelame legendu, viz help(legend)
legend(x=85, y=0.04, c("mff","CVUT"), lty=c(1,2), bty="o", col = c("black", "blue"))
# Komu by se nelibily pouzite barvy, tak ma nasledujici vyber
farby <- colors()
farby;
### napr "modre" farby (nazvy z anglictiny):
farby[grep("blue",farby,ignore.case=TRUE)]
### -hranate zatvorky - indexovanie pola
# # Bonus
# Jaka je pst, ze kdyz se potka se potka student z MFF
# se studentem z CVUT, tak matfyzak bude mit vyssi IQ?
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # Alternativni rozdeleni
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# Q: Hazime (nezfalsovanou) minci. Jaka je pst, ze pocet
# rubu v 1000 pokusech bude mezi 450 a 550?
# A: Jedna se o binomicke rozdeleni, kdy pocet pokusu
# je n = 1000 a pst uspechu je p = 0.5. Tudiz hledanou
# pst spocteme analyticky jako
pbinom(550, size = 1000, prob = 0.5) - pbinom(449, size = 1000, prob = 0.5)
# Ze zakona velkych cisel vime, ze podil rubu by mel
# konvergovat k jedne polovine.
# Generujme si 10 000 hodu minci
x <- rbinom(10000, size = 1, prob = 0.5);
# Spocteme si kumulativni pocty uspechu...
x <- cumsum(x);
# ...a podily uspechu
podil.uspechu <- x/seq(1,10000,1);
plot(podil.uspechu[-(1:50)], type = "l")
abline(h = 0.5, lty = "dotted")
# Pokud bychom si chteli dany obrazek ulozit,
# tak bud se proklikame (coz pod Linuxem nejde),
# anebo pouzijeme
dev.copy2eps(file="konvergence.eps")
# pokud preferujeme jiny format, napr. "pdf" pak
# muzeme pouzit
dev.print(pdf, file = "konvergence.pdf")
# Dalsi prikazy pro graficka zarizeni
dev.list() # zoznam vsetkych graf. zariadeni
dev.off() # ukonci aktualne graficke zariadenie
graphics.off() # ukonci vsetky graficke zariadenia
# # Bonus: 200 studentu jde na zkousku z analyzy.
# Kazdy z nich uspeje s pravdepodobnosti 0.23.
# a) Jaka je pst, ze zkousku udela mene nez 50 studentu?
# b) Predpokladejme, ze pst udelani zkousku zavisi na
# IQ studenta pomoci vzorce p = (IQ - 70)/200.
# IQ studentu ma normalni rozdeleni N(115,64).
# Jaka je pst, ze zkousku udela mene nez 50 studentu?
###########################################################
##### PRIKLAD (BONUS) ######
###########################################################
### Studentovo t-rozdelenie
curve(dnorm(x,0,1),-5,5,lwd=2,col="red",main="Hustoty N(0,1), Studentova a Cauchyho rozdeleni", xlab="x", ylab="Hustota f(x)")
curve(dt(x,15),lwd=2,col="blue",add=TRUE)
curve(dt(x,5),lwd=2,col="green",add=TRUE)
curve(dcauchy(x),lwd=2,col="brown",add=TRUE) # odpovida t(1)
legend(x=-4, y=.3, legend=c("N(0,1)","t(15)","t(5)","Cauchy"), lwd=2, col=c("red","blue","green","brown"), bty="n")
### Chi^2-rozdelenie
curve(dchisq(x,df=2),from=0.0001,to=15,lwd=2,col="blue",main=expression(Hustoty~~chi[(df)]^{2}~~rozdeleni), xlab="x",ylab="Hustota f(x)")
curve(dchisq(x,df=3),lwd=2,col="green",add=TRUE)
curve(dchisq(x,df=5),lwd=2,col="brown",add=TRUE)
curve(dchisq(x,df=10),lwd=2,col="black",add=TRUE)
curve(dchisq(x,df=1),lwd=2,col="red",add=TRUE)
legend(x=8, y=.4, legend=c("df = 1","df = 2","df = 3","df = 5","df = 10"), lwd=2, col=c("red","blue","green","brown","black"), bty="n")
### F-rozdeleni - skusime v novom okne (pozri "help("X11")")
X11() # nove graficke okno...
curve(df(x,20,25),0.0001,10,n=500,lwd=2,col="blue",main=paste("Hustoty ",expression(F(m,n))," rozdeleni"), xlab="x", ylab="Hustota f(x)")
curve(df(x,2,10),0.0001,10,n=500,lwd=2,col="green",add=TRUE)
curve(df(x,10,2),0.0001,10,n=500,lwd=2,col="brown",add=TRUE)
curve(df(x,15,20),0.0001,10,n=500,lwd=2,col="black",add=TRUE)
curve(df(x,1,1),0.0001,10,n=500,lwd=2,col="red",add=TRUE)
legend(x=5, y=.8, legend=c("m = 1, n = 1","m = 2, n=10","m = 10, n = 2","m = 15, n = 20","m = 20, n = 25"), lwd=2, col=c("red","green","brown","black","blue"), bty="n")
dev.cur() # vypise cislo aktualniho okna
dev.set(2) # nastavi aktualni okno na device cislo 2
###########################################################
##### REALNE DATA - ZAKLADNE CHARAKTERISTIKY ######
###########################################################
# pruzkum IQ a znamek
# Pokud data nemate od minula, tak si stahnete
# (do sveho pracovniho adresare) soubor
# data.txt a a nactete tento soubor do R-ka pomoci
DATA <- read.table("data.txt", colClasses=c("factor", "factor", "factor", "numeric", "numeric", "numeric", "numeric"), header=F);
# pojmenuju sloupecky
names(DATA) <- c("index","skola","pohlavi","IQ","znamka1","znamka2","znamka3")
# Prejmenuju pohlavi 0,1 na Z, M
levels(DATA$pohlavi) <- c("Z", "M");
summary(DATA);
# Zajistime si pristup k promennym
attach(DATA);
# Spocteme si korelacni koeficient mezi IQ a znamka1
cor(cbind(IQ, znamka1))
# Bonus
# Zjistete jak se lisi korelacni koeficient mezi IQ a znamkou1
# u divek a kluku zvlast
# # Korelacni koeficient mnohonasobne korelace
cormat <- cor(cbind(IQ,znamka1, znamka3));
#
Rxx <- cormat[2:3,2:3];
Ryx <- cormat[1,2:3];
rho.xy <- sqrt(t(Ryx)%*%solve(Rxx)%*%Ryx);
# Porovnejte rho.xy s prostym korelacnim koeficientem
# cor(IQ, znamka1). Co z toho vyplyva
# # Koeficient parcialni korelace
ryz <- cor(znamka1,znamka3);
ryx <- cor(znamka1,IQ);
rzx <- cor(znamka3,IQ);
# Koeficient parcialni korelace potom je
ryz.x <- (ryz - ryx * rzx)/sqrt((1-ryx^2)*(1-rzx^2));
# porovnejte tuto hodnost s kor. koeficientem IQ a znamka1