MAI061 cvičení 2

Z ωικι.matfyz.cz
Přejít na: navigace, hledání
###########################################################
#####         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