Navodimo osnovne metode modeliranja slučajnih veličina i njihovu primenu u okviru programskog paketa R.
Generišemo slučajan broj u iz intervala (0,1) korišćenjem runif(1) funkcije. Funkcija rapodele diskretne slučajne veličine je funkcija sa skokovima koja postiže vrednosti u intervalu (0,1). Tačnije, ona postiže vrednosti \(0, p_1, p_1+p_2, ..., p_1+..+p_{n-1}, 1\). Broj koji je postigla slučajna veličina \(X\) određujemo u zavisnosti od toga kom intervalu (od n+1 njih na koje vrednosti koje uzima funkcija raspodele dele y-osu) pripada u. Dakle, slučajna veličina sa diskretnom raspodelom je uzela vrednost \(x_i\) ako je \(p_1+..+p_{i-1}<u<p_1+..+p_i\).
Objašnjenje: verovatnoća da je u iz gore navedenog intervala je bas \(p_i\), a to je i verovatnoća da \(X\) uzme vrednost \(x_i\).
Bernuli_random <- function(p)
{
u<-runif(1)
if(u > 1-p)
x<-1
if(u < 1-p)
x<-0
return (x)
}
Bernuli_random(0.8)
## [1] 1
a<-vector()
for(i in 1:20)
a<-c(a,Bernuli_random(0.1))
a
## [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Binom_random<-function(n,p)
{
a<-vector()
for(i in 1:n)
a<-c(a,Bernuli_random(p))
return(sum(a))
}
set.seed(1)
Binom_random(10,0.5)
## [1] 6
Geom_random <- function(p, delta){
n0 <- floor(log(delta)/log(1-p))+1
X <- 1:n0 #vrednosti koje uzima zasecena
P <- vector() #verovatnoce sa kojima zasecena sl vel uzima odg vrednosti
P<-((1-p)^(X-1))*p #suma nije 1 jer smo zasekli
#zato cemo promeniti poslednji clan cime dobijamo to zasecanje
P[n0]=1-sum(P[1:(n0-1)])
gama<-runif(1)
pom<-0
for(i in 1:n0){
if(gama>pom && gama<=pom+P[i])
x<-X[i]
pom<-pom+P[i]
}
return (x)
}
set.seed(1)
Geom_random(0.3,0.01)
## [1] 1
Negativna binomna NB(p,r) - broj pokušaja do r-tog uspeha. Slučajan broj iz ove raspodele može se dobiti kao zbir r slučajnih brojeva iz geomtrijske G(p) raspodele.
Puasonova_random<-function(lambda,delta)
{
n0_pois<-function(n,lambda)
{
return (lambda^(n+1)*exp(-lambda)*(n+2)/(factorial(n+1)*(n+2-lambda)))
}
n0=max(ceiling(lambda)-2,1)
while(n0_pois(n0,lambda)>delta)
{
n0=n0+1
}
#repeat{
# n0=n0+1
# if(n0_pois(n0,lambda)<delta){
# break
# }
#}
#ovim smo nasli n0, sada kao malopre
X <- 0:n0 #vrednosti koje uzima zasecea
P <- vector() #sa kojim verovatnocama zasecena uzima
P<-lambda^X*exp(-lambda)/factorial(X) #suma nije 1 jer smo zasekli
#zato cemo promeniti poslednji clan cime dobijamo to zasecanje
P[n0]=1-sum(P[1:(n0-1)])
gama<-runif(1)
if(gama<=P[1])
x<-X[1]
pom<-0
for(i in 1:length(X)){
if(gama>pom && gama<=pom+P[i])
x<-X[i]
pom<-pom+P[i]
}
return (x)
}
set.seed(1)
Puasonova_random(2,0.01)
## [1] 1
Ako X ima funkciju raspodele F, tada slučajna veličina F(X) ima U[0,1] raspodelu. Ako X ima U[0,1] raspodelu, tada \(F^{-1}(X)\) ima funkciju raspodele F.
Ovo tvrdjenje nam daje mogućnost da generišemo slučajne brojeve iz onih apsolutno neprekidnih raspodela čija se funkcija raspodele može izraziti analitički.
Exp_random <- function(lambda)
{
gama<-runif(1)
x<-(-1/lambda)*log(1-gama)
return(x)
}
set.seed(1)
Exp_random(3)
## [1] 0.102859
Erlangova (gama) raspodela gama(lambda,n) se može predstaviti u obliku zbira n nezavisnih eksponencijalno raspodeljenih slučajnih veličina sa parametrom lambda.
Erlang_random<-function(n,lambda)
{
x<-0
for(i in 1:n)
{
gama<-runif(1)
x<-x+(-1/lambda)*log(1-gama)
}
return(x)
}
set.seed(1)
Erlang_random(10,2)
## [1] 5.778018
Još neke raspodele apsolutno neprekidnog tipa koje se mogu modelirati metodom inverzije su Vejbulova, Frešeova i Gumbelova. Pogledajte njihove funkcije raspodela i napišite funkcije za generisanje slučajnih brojeva iz tih raspodela! Napišite odgovorajaće kodove i u C-u.