# OSMI CAS


# CGT i neke aproksimacije binomne raspodele.
# Neka su date jednako raspodeljene nezavisne slucajne velicine: 
# X_1, X_2, ..., X_n i D(X_i)<+inf, za svako i=1, ..., n.
# Ako posmatramo njihovu parcijalnu sumu: S_n=X_1+...+X_n
# Onda:
# (S_n -E(S_n))/sqrt(D(S_n)) -> N(0, 1), kada n-> +inf.
# Specijalno za S_n~Bin(n, p).
# Zato pri sledecim uslovima: 
# n>30
# n*p>10
# Mozemo Binomnu raspodelu da aproksimiramo normalnom!


# 1)
# Posmatrajmo eksperiment bacanja lopte u kos. Neka imamo ukupno 300 bacanja 
# i verovatnoca pogotka je 1/5.
# Izracunati verovatnocu da je bilo najvise 70 pogotka.

# Neka je X~Bin(300, 1/5). Trazi se P{X<=100}=
# P{(X- E(X))/sqrt(D(X)) <= (70- E(X))/ D(X)}=
# P{X*<= (70- 60)/sqrt(48)} , gde je sada  X* ~ N(0, 1)
vrednost=(70-300*1/5) / (sqrt(300*1/5*4/5))
pnorm(vrednost, 0, 1) # ovde smo dobili vrednost nakon aproksimacije

pbinom(70, 300, 1/5) # ovde prava vrednost, bez aproksimacije.
# Relativno su bliske.

# Dok u slucaju n>30, a n*p<=10 aproksimiramo sa Puasonovom 
# raspodelom sa parametrom Poiss(n*p)


# 2) 
# Poznato da u nekom gradu stanovnik ima bicikl sa verovatnocom 0.02,
# a motor sa verovatnocom 0.01, s tim sto niko nema i bicikl i motor. 
# Izracunati verovatnocu da od 100 slucajno odabranih stanovnika broj
# onih koji poseduju bar jedno od ova dva prevozna sredstva bude izmedju
# 2 i 6 ukljucujuci i te brojeve.

# Malo sam se zaneo. Zapravo prava vrednost je da aproksimiramo 
# bas tu binomnu B~Bin(100, 0.03) sa Puasovom(3), koju cemu oznaciti sa
# B*, tj:
# P{2<=B<=6} =~ P{2<=B*<=6} = P{B*<=6} - P{B*<2} 
# = P{B*<=6} - P{B*<=1} = ppois(6, 3) - ppois(1, 3)

# Apsoksimirana vrednost
ppois(6, 3) - ppois(1, 3)

# Prava vrednost.
pbinom(6, 100, 0.03) - pbinom(1, 100, 0.03)


# 3) 
# Slucajna velicina X ima Uniformnu raspodelu Unif[-pi/2, pi/2].
# Ako je Y = cos(X), odrediti gustinu(i plotovati je) slucajne velicine Y.
# Naci pomocu simulacija(Monte Karlo) E(Y).


# resenje:

treci_zadatak <- function(n)
{
  X = runif(n, -pi/2, pi/2)
  Y = cos(X)
  return(Y)
}

rezultat = treci_zadatak(10000)

# Da se mogu videti dva plota odjednom
par(mfrow=c(1,2))

# Prvo ocenimo gustinu histogramom
hist(rezultat)

# I neprekidno
density(rezultat)
plot(density(rezultat))
# Nadjimo srednju vrednost
mean(rezultat)


# 4)
# Neka je X ~ Exp(a). Plotovati gustine i naci simulacijama srednju vrednost:
# a) Y = |1 - X|
# b) Z = min{X, X^2}
# v) T = [X]


# a)
simulacija_a <- function(n, a)
{
  x = rexp(n, a)
  y = abs(1-x)
  return(y)
}

vrednost = simulacija_a(10000, 2)

# plot gustine
hist(vrednost)
plot(density(vrednost))

# srednja vrednost
mean(vrednost)


# b)
simulacija_b <- function(n, a)
{
  x = rexp(n, a)
  # pmin() - uzima clan po clan minimume.
  z = pmin(x, x^2)
  
  return(z)
}

vrednost = simulacija_b(10000, 2)
# plot gustine
plot(density(vrednost))

# srednja vrednost
mean(vrednost)


# v)
simulacija_v <- function(n, a)
{
  x = rexp(n, a)
  # floor - isto sto i ceo deo.
  t = floor(x)
  
  
  return(t)
}
vrednost = simulacija_v(10000, 2)
# plot gustine
plot(density(vrednost))

# srednja vrednost
mean(vrednost)



# Pomenuti da je zbir nezavisnih normalnih
# raspodela opet normalna raspodela.

# 5)
# Neka su date slucajne velicine X i Y, 
# iz iste klase raspodela
# i nezavisne. Da li je njihov zbir is iste 
# klase raspodela 
# kao i pocetne slucajne velicine?
#
# Ovde cemo uraditi na primeru normalne i uniformne raspodele.
# Dok za druge probajte sami da ispitate.
simulacija <- function(n, m1, sigma1, m2, sigma2)
{
  x = rnorm(n, m1, sigma1)
  y = rnorm(n, m2, sigma2)
  
  z = x + y
  
  hist(z)
  plot(density(z))
  
  return(c(mean(z), var(z)) )
}

simulacija(100000, -2, 1, 2, 3)

# Zbir uniformnih nije uniformna!
simulacija_uniformna <- function(n, a1, b1, a2, b2)
{
  x = runif(n, a1, b1)
  y = runif(n, a2, b2)
  
  z = x + y
  
  hist(z)
  plot(density(z))
  return(c(mean(z), var(z)) )
}


simulacija_uniformna(1000, 3, 5, 2, 6)
# dobija se trougaona raspodela