#-------------------------------------------------
#  uso di norm_mult_cond() per simulare la logica
#  inferenziale e prdittiva dietro un esperimento
#  nel quale le variabili sono distribuite normalmente
#
#  GdA 21/2/2014
#-------------------------------------------------

# eseguire i comandi da console

# definiamo la funzione
source("norm_mult_cond.R")


# "esperimento" :
# la prima variabile sta per il "valore vero",
# le altre i valori misurati, distribuiti normalmente
# ad esso e "condizionatamente indipendenti"

n=6
mu <- rep(0,n)
sigma <- c(100, rep(1,n-1))
V <- matrix(rep(sigma[1]^2, n*n), c(n,n))
diag(V)[2:n] <- diag(V)[2:n] + sigma[2:n]^2

# verifichiamo
mu                     # valori attesi
(su <- sqrt(diag(V)))  # incertezze standard  ("standard uncertainty")
V                      # matrice di covarianza
V/outer(su,su)         # matrice di covarianza

# ipotizziamo un valore della prima variabile e ricondizioniamo
mu.c <- c(2, rep(NA, n-1))
out<- norm_mult_cond(mu, V, mu.c, full=TRUE ) 
out$mu
sqrt(diag(out$V))
out$V                # le variabili > 1 sono "condizionatamente indipendenti"!

# ipotizziamo invece che la (sola) variabile 'n' assuma un preciso
# valore e ricondizioniamo
mu.c <- c(rep(NA, n-1), 2)
out<- norm_mult_cond(mu, V, mu.c, full=TRUE )
out$mu            
sqrt(diag(out$V))  # perché gli elementi 2:(n-1) sono sqrt(2) del primo?
out$V

# idem se lo facciamo sulla nr 2
mu.c <-  c(NA, 2, rep(NA, n-2))
out<- norm_mult_cond(mu, V, mu.c, full=TRUE )
out$mu
sqrt(diag(out$V))  
out$V

# assumiamo i valori 2:n, estratti random con una certa media (ad es. 5)
# e deviazione standard sigma[2] (in questo esempio sigma[2:n] sono uguali)
mu.c <- c(NA, rnorm(n-1, 5, sigma[2]))
out<- norm_mult_cond(mu, V, mu.c, full=TRUE )
out$mu
sqrt(diag(out$V))
out$V

# COSA SI IMPARA?

# per confronto:
mean(mu.c[2:n])    # a cosa è dovuta la piccola differenza
                   # rispetto a out$mu[1]?
sigma[2]/sqrt(n-1)

#-----------------------------------------------------------
#-----------------------------------------------------------
# caso con risposte diverse, ad esempio SIGMA CRESCENTI
n=6                                       #      |
mu <- rep(0,n)                            #      |
sigma <- c(100, 1:(n-1))                  # <----| 
V <- matrix(rep(sigma[1]^2, n*n), c(n,n))
diag(V)[2:n] <- diag(V)[2:n] + sigma[2:n]^2

# ripetiamo le stesse istruzioni precedenti (quasi: -> ***)
# verifichiamo
mu                     # valori attesi
(su <- sqrt(diag(V)))  # incertezze standard  ("standard uncertainty")
V                      # matrice di covarianza
V/outer(su,su)         # matrice di covarianza

# ipotizziamo un valore della prima variabile e ricondizioniamo
mu.c <- c(2, rep(NA, n-1))
out<- norm_mult_cond(mu, V, mu.c, full=TRUE ) 
out$mu
sqrt(diag(out$V))
out$V                # le variabili > 1 sono "condizionatamente indipendenti"!

# ipotizziamo invece che la (sola) variabile 'n' assuma un preciso
# valore e ricondizioniamo
mu.c <- c(rep(NA, n-1), 2)
out<- norm_mult_cond(mu, V, mu.c, full=TRUE )
out$mu            
sqrt(diag(out$V))  # che legge seguono?  (***)
out$V

# idem se lo facciamo sulla nr 2
mu.c <-  c(NA, 2, rep(NA, n-2))
out<- norm_mult_cond(mu, V, mu.c, full=TRUE )
out$mu
sqrt(diag(out$V))   # che legge seguono? (***) [NON COME nel punto precedente!]
out$V

# assumiamo i valori 2:n, estratti random con una certa media (ad es. 5)
# e deviazione standard individuale sigma[2:n]
mu.c <- c(NA, rnorm(n-1, 5, sigma[2:n]))   # <--- ***  !!
out<- norm_mult_cond(mu, V, mu.c, full=TRUE )
out$mu
sqrt(diag(out$V))
out$V

# COSA SI IMPARA?

# per confronto:
mean(mu.c[2:n])    # *** ora invece c'è una certa rispetto a out$mu[1]: PERCHÉ?
                   # Eventualmente RIPETERE le ultime istruzioni
                   # PIÙ VOLTE, in quanto i risultati dipendono
                   # dal campione casuale

