Probab. Teórica x Probab. Simulada

(Caso Particular) Se \(X\) e \(Y\) são duas variáveis aleatórias independentes distribuição uniforme discreta sobre \(\{0,1,\cdots,N\}\), então a convolução \(X+Y\) tem a seguinte distribuição

\[ P(X+Y=j)=\begin{cases} \dfrac{j+1}{(N+1)^2}, & se & j \in \{\;0,\cdots,N\;\},\\\\ \dfrac{2N-j+1}{(N+1)^2}, & se & j \in \{N+1, \cdots, 2N\},\\\\ 0, & se & j\not\in \{0,\cdots,2N\}. \end{cases} \]

set.seed(123456)
library(purrr) # biblioteca para gerar as amostras
# da distribuicao unif. discreta. Nao existe no R base.

# Construcao da funcao que calcula as probabilidades

probab.conv <- function(j,N){ 
  n<- 1e7 # tamanho amostral
  set.seed(123456)
  x<- rdunif(n,b = N,a = 0) # geracao da amostra x
  y<- rdunif(n,b = N,a = 0) # geracao da amostra y
  if (j <= N & j>= 0){
        prob.teo <- (j+1)/(N+1)^2 # prob. teorica
      }else if(j > N & j <= 2*N){
        prob.teo <- (2*N-j+1)/(N+1)^2 # prob. teorica
      }else{
        prob.teo <- 0
   }
  prob.sim <- mean( (x+y)==j ) # prob. simulada
  return(list(probab.simulada=prob.sim, probab.teorica=prob.teo))
}

Exemplos ( Aplicação para alguns pares (j,N) )

probab.conv(4,10) # j=4 e N=10
## $probab.simulada
## [1] 0.0412876
## 
## $probab.teorica
## [1] 0.04132231
probab.conv(10,7) # j=10 e N=7
## $probab.simulada
## [1] 0.0781256
## 
## $probab.teorica
## [1] 0.078125
probab.conv(20,7) # j=20 e N=7 (j > 2*N)
## $probab.simulada
## [1] 0
## 
## $probab.teorica
## [1] 0
probab.conv(-2,9) # j=-2 e N=7 (j < 0)
## $probab.simulada
## [1] 0
## 
## $probab.teorica
## [1] 0

(Caso Geral) Se \(X\) e \(Y\) são duas variáveis aleatórias independentes que possuem, respectivamente, distribuições uniformes discreta sobre \(\{0,1,\cdots,N\}\) e \(\{0,1,\cdots, M\}\), então a convolução \(X+Y\) tem a seguinte distribuição

\[ P(X+Y=j)=\begin{cases} \dfrac{j+1}{(N+1)^2}, & se & j \in \{\;0,\cdots,min\{N,M\}-1\;\},\\\\ \dfrac{min\{N,M\}+1}{(N+1)(M+1)},& se & j \in \{min\{N,M\},\cdots, max\{N,M\}\},\\\\ \dfrac{(N+M)-(j-1)}{(N+1)(M+1)}, & se & j \in \{max\{N,M\}, \cdots, 2N\},\\\\ 0, & se & j\not\in \{0,\cdots,2N\}. \end{cases} \]

# Construcao da funcao que calcula as probabilidades

probab.conv.g <- function(j,N,M){
  set.seed(123456) 
  n<- 1e7 # tamanho amostral
  
  x<- rdunif(n,b = N,a = 0) # geracao da amostra x
  y<- rdunif(n,b = M,a = 0) # geracao da amostra y
  
  mm <- min(N,M)
  MM <- max(N,M)
  
  if (j >=0 & j <= mm - 1) {
    
        prob.teo <- (j+1) / (N+1)^2 
        
      } else if (j >= mm & j <= MM){ 
        
        prob.teo <- (mm + 1) / ( (N+1)*(M+1) )
        
      } else if (j >= MM & j<= 2*N) {
        
        prob.teo <- ( (N+M) - (j-1) ) / ( (N+1)*(M+1) )
      
      } else {
        
        prob.teo <- 0
    }
  
  prob.sim <- mean( (x+y)==j ) # prob. simulada
  
  return(list(probab.simulada=prob.sim, probab.teorica=prob.teo))
}

Exemplos ( Aplicação para alguns ternos (j,N,M) )

probab.conv.g(4,10,10)
## $probab.simulada
## [1] 0.0412876
## 
## $probab.teorica
## [1] 0.04132231
probab.conv.g(10,7,7) #j=10, N=M=7
## $probab.simulada
## [1] 0.0781256
## 
## $probab.teorica
## [1] 0.078125
probab.conv.g(20,7,7) #j=20, N=M=7 ( j>2N )
## $probab.simulada
## [1] 0
## 
## $probab.teorica
## [1] 0
probab.conv.g(-2,9,9) #j=-2, N=M=9 ( j<0 )
## $probab.simulada
## [1] 0
## 
## $probab.teorica
## [1] 0
probab.conv.g(15,20,24)
## $probab.simulada
## [1] 0.0304855
## 
## $probab.teorica
## [1] 0.03628118