TP3-Estatística Computacional

simulacoes_sistema<-function(m,prob_equal,tipo_estimacao){
  #browser()
  # tipo_estimacao: padrao(TRUE) ou alternativa(FALSE)
  x<-numeric(m)
  y<-numeric(m)
  
  if (prob_equal==TRUE){
  for(i in 1:m){
    resul<-gera_dados(50,50,TRUE)
    #resul<-sim_funcionamento(10,10,TRUE)
    x[i]<-resul[1]
    y[i]<-resul[2]
    
    }
  } 
  else {
    for(i in 1:m){
      resul<-gera_dados(50,50,FALSE)
      #resul<-sim_funcionamento(10,10,FALSE)
      x[i]<-resul[1]
      y[i]<-resul[2]
      
    }
    
  }
  #browser()
  
  if(tipo_estimacao){
  x<-unlist(x)
  y<-unlist(y)
  hist(x)
  plot(y,x)
  theta=sum(x)/m
  var=var(x)/m
  }
  else{
  x<-unlist(x)
  y<-unlist(y)
  r<-lm(x~y)
  plot(y,x)
  a<-r$coefficients[[1]]
  a<-
  b<-r$coefficients[[2]]
  theta <- a + b*25
  var=var(r$residuals)/m
    
  }
    
    
  # Retorna estimativas
  return (list(theta,var))
}

gera_dados<-function(num,N,P){
  #browser()
  # num indica o n?mero de elementos no vetor
  # P indica se os elementos do vetor de probabiliades ser?o iguais ou diferentes.
  # N indica o n?mero de elementos que ser?o sorteados
  # Gerando vetor com disposi??o dos elementos aleat?ria.
  n<-sample(seq(num))
  # Calculando vetor de probabilidades. Se P=TRUE, o vetor de probabilida
  # des será igual, cc será diferente.
  p<-numeric(num)
  if(P){
    p<-rep(1/num,num)
    
  }
  else{
    denominador<-sum(seq(1,num))
    # for(i in 1:num){
    #   p[i]<-i/denominador
    # }
    # 
    p<-seq(1:num)/denominador
    
  }
  # Sorteando elemento e reordenando.
  #u<-gera_uniformes(1)
  somaX<-0
  somaY<-0
  
  
  for(i in 1:N){
  
  acum <-cumsum(p)
  u<-runif(1)
  # Identifica a posicao do menor elemento no vetor de acumulação.
  # cujo valor é imediatamente maior que u. Seleciona o elemento
  # imediatamente seguinte
  
  pos <-sum(acum < u) +1

  #  elem_selec<-1
  # for(i in 1:num){
  #   # calcula o vetor de probabilidades acumulada
  #   acum<-sum(p[1:i])
  #   if((u > acum)){
  # # Seleciona o elemento 
  #     elem_selec<-i+1
  #   }
  #   else {
  #     break
  #   }
  # }
  # reordena vetor
  # Elementos anteriores ao elemento selecionado(elem_selec)
  #num<-10
  #p<-(seq(10))
  #elem_selec<-8
  # if(elem_selec==2 || elem_selec==1){
  #   browser()
  # }
  # 
  # Só tem sentido reordenar o vetor de probabilidades p se os valores
  # forem diferentes!
  if (pos >1 & !P) {
  temp<-pos-1
  elem_ante<-p[c(1:temp)]
  
  # Elementos posteriores ao elemento selecionado(elem_selec)
  temp<-pos+1
  elem_post<-p[c(pos:num)]
  
  p[1]<-p[pos]
  p[2:pos]<-elem_ante
  
   }
  
  somaX<-somaX+pos
  somaY<-somaY+u
  
  
  }
  
  
  return(list(somaX,somaY))
}


# Executanto sistema 10.000 vezes, com probabilidades iguais e estimação padrao
simulacoes_sistema(10000, TRUE, TRUE)

## [[1]]
## [1] 1275.536
## 
## [[2]]
## [1] 1.04775
# Executanto sistema 10.000 vezes, com probabilidades diferentes e estimação #padrao
simulacoes_sistema(10000, FALSE, TRUE)

## [[1]]
## [1] 1343.912
## 
## [[2]]
## [1] 0.8483715
# Executanto sistema 10.000 vezes, com probabilidades iguais e estimação #alternativa
simulacoes_sistema(10000, TRUE, FALSE)

## [[1]]
## [1] 1299.427
## 
## [[2]]
## [1] 0.0004229573
# Executanto sistema 10.000 vezes, com probabilidades diferentes e estimação 
# alternativa
simulacoes_sistema(10000, FALSE, FALSE)

## [[1]]
## [1] 1109.016
## 
## [[2]]
## [1] 0.1119325