Studio preliminare
Progetto
Vogliamo studiare la relazione tra numero di spriz, tipo di software utilizzato e stress.
Il modello che vogliamo valutare è
\[ stress = \beta_0 + \beta_1 \times spriz + \beta_2 \times software + \beta_3 \times spriz \times software + \epsilon \] Usiamo le seguenti variabili: - stress, scala a 100 punti - spriz, numero di spriz e software utilizzato, R o excel
Design analysis
Ipotizziamo che lo stress di distribuisca normalmente con media 70 e dev.st. 10, quindi graficamente:
Definizione dei parametri
Vogliamo simulare i punteggi standardizzati di stress; per semplicità consideriamo il numero di spriz come variabile centrata sulla media ed il tipo di software codificato con -.5, .5 al posto della classica codifica 0-1.
I parametri del modello per la simulazione saranno i seguenti:
- \(\beta_0 = 0\)
- \(\beta_1 = -0.3\)
- \(\beta_2 = 0.01\)
- \(\beta_3 = 0.1\)
Data simulation
Simuliamo 1000 soggetti.
Iniziamo con la variabile spriz:
<- rpois( N, lambda )
spriz <- scale( spriz )
spriz_s plot( table( spriz ), type = "h" )
Poi generiamo la variabile software:
<- sample( c(-.5,.5), N, replace = TRUE ) software
e per finire la variabile stress, sulla base del modello:
<- b0 + b1*spriz_s + b2*software + b3*spriz_s*software + rnorm( N )
stress
plot( density( stress ) )
Aggreghiamo le variabili in un data frame
e le rappresentiamo con grafici univariati e bivariati:
<- data.frame(
myData spriz = spriz_s, software
stress,
)
library( GGally )
ggpairs( myData )
Stima dei parametri dai dati simulati
Per stimare i parametri, utilizziamo un modello lineare bayesiano
library( brms )
<- brm( stress ~ spriz*software, data = myData, cores = 4,
fit prior = myPrior )
con le seguenti prior:
prior class coef
1 student_t( 3, 0, 1 ) b
2 b software
3 b spriz
4 b spriz:software
5 student_t(3, 0, 2.5) Intercept
6 student_t(3, 0, 2.5) sigma
Visualizziamo le posterior ed i traceplot del modello:
Le stime dei parametri sono le seguenti:
Family: gaussian
Links: mu = identity; sigma = identity
Formula: stress ~ spriz * software
Data: myData (Number of observations: 1000)
Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
total post-warmup draws = 4000
Regression Coefficients:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept -0.02 0.03 -0.09 0.04 1.00 4803 3205
spriz -0.30 0.03 -0.36 -0.24 1.00 5312 3161
software -0.04 0.06 -0.16 0.09 1.00 4833 2940
spriz:software 0.11 0.07 -0.02 0.24 1.00 4617 3194
Further Distributional Parameters:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma 1.01 0.02 0.97 1.06 1.00 5775 3337
Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
Ciclo di simulazione
Per determinare quanti soggetti servono per stimare bene questi parametri esploriamo i seguenti livelli di \(n\): 20, 50, 100.
<- NULL
PARTAB for (n in n_vec) {
for ( b in 1:B) {
# genero i predittori
<- rpois( n, lambda )
spriz <- scale( spriz )
spriz_s <- sample( c(-.5,.5), n, replace = TRUE )
software
# genero la dipendente
<- b0 + b1*spriz_s + b2*software + b3*spriz_s*software + rnorm( n )
stress
# model fit
<- data.frame(
Z spriz = spriz_s,
stress,
software
)
if (b == 1) {
<- brm( stress ~ spriz*software, data = Z, cores = 4,
fit prior = myPrior )
else {
} <- update( fit, newdata = Z )
fit
}
# recupero le stime dei parametri e gli intervalli di credibilità
<- data.frame( fixef( fit, probs = round(PROBS,3) ) )
PAR $par <- row.names(PAR)
PAR$n <- n
PAR
<- rbind( PARTAB, PAR )
PARTAB
} }
Vediamo se le stime dei parametri sono coerenti con l’attesa:
Ed infine, le curve di potenza, ottenute contando quante volte l’intervallo di credibilità 89% non contiene lo zero: