******************************************************************************* ******************************************************************************* * * ******************* * *** MULTIPLE IMPUTATION *** * ******************* * imputazione multivariata (più variabili da imputare) * ******************************************************************************* use shareW1&W2.dta, clear **************************************************************************** **************************************************************************** * * IMPUTAZIONE PER PATTERN MONOTONO * **************************************************************************** keep chronicw1 maxgrip gender age_int wave country mergeid interview *missing per costruzione tab interview wave drop if age_int<50 | age_int==. | wave==2 | interview!=1 *questa è una semplificazione necessaria per avere un esempio di pattern monotono recode chronicw1 maxgrip(min/-1=0) *osserviamo il pattern dei valori mancanti misstable summarize misstable pattern *set dei dati mancanti e delle imputazioni mi set mlong mi register imputed maxgrip chronicw1 mi passive: gen age2 = age_int^2 mi register regular mergeid country wave gender age_int *check sul pattern dei dati mancanti mi misstable nested *imputazione per pattern monotono mi impute monotone (poisson) chronicw1 (regress) maxgrip = gender age_int age2 i.country, add(10) noisily replace *diagnostica midiagplots chronicw1, m(1 7) combine midiagplots maxgrip, m(1 7) combine *un modello diverso con diversi predictors mi impute monotone /// (ologit chronicw1 gender age_int age2 i.country) /// (pmm maxgrip gender age_int i.country, knn(3)), custom noisily replace *diagnostica midiagplots chronicw1, m(1 7) combine midiagplots maxgrip, m(1 7) combine * esempio con IF per sottogruppi mi impute monotone /// (ologit chronicw1 age_int age2 i.country if gender==1) /// (pmm maxgrip gender age_int i.country, knn(3)), custom noisily replace **************************************************************************** **************************************************************************** * * IMPUTAZIONE PER PATTERN ARBITRARI * **************************************************************************** use shareW1&W2.dta, clear keep maxgrip casp mergeid country wave gender age_int hhsize interview adl2 sphus *eliminiamo coloro che sono stati campionati *ma non hanno partecipato all'intervista drop if interview!=1 *abbiamo 4 variabili con valori mancanti *consideriamo anche -2 e -1(don't know) come valori mancanti misstable sum recode adl2 casp maxgrip sphus (-1 -2=.) ************************************************************ * adl2 = var. dicotomica - avere una o più limitazioni di salute * casp = var. continua (12-48) - qualità della vita * maxgrip = var. continua (1-92) - forza della stretta della mano * shus = var. ordinale (1 excellent- 5 poor) - salute autopercepita ************************************************************ tab1 adl2 casp maxgrip sphus *********************************************************** * PER UNA INTERPRETAZIONE SOSTANZIALE dovremmo vedere * chi sono coloro che non rispondono [qui considero CASP che * ha la proporzione maggiore di missing] *********************************************************** gen miss=1 if casp==. recode miss(.=0) tab country miss,row mean age_int, over(miss) tab adl2 miss,row tab sphus miss,row ************************************************************* * Quelli che non rispondono in Casp sono il 21% e sono * tendenzialmente più anziani (di 2 anni) * con limitazioni di salute e bassa salute auto-percepita * vivono in: Francia,Israele, Belgio, Italia *********************************************************** ***************************************************** * registriamo le variabili come IMPUTED = da imputare * o come REGULAR = no missing values ***************************************************** mi set mlong mi register imputed adl2 casp maxgrip sphus mi register regular country wave gender age_int hhsize **************************************************************** **************************************************************** * * MODELLO DI IMPUTAZIONE * multivariate normal distribution (MVN) * **************************************************************** * ALGORITMO: * * Data augmentation (DA) che appartieme alla famiglia * di algoritmi del Markov Chain Monte Carlo (MCMC) in cui si * assume che la distribuzione multivariata dei missing condizionata * alle variabili osservate/ complete sia normale. * Nota: in realtà MCMC da risultati attendibili anche nel caso in cui * le assunzioni di normalità della distribuzione multivariata * siano violate nel caso in cui il campione sia abbastanza grande. * * Nota: valori negativi e decimali sono possibili, quindi attenzione * alle variabili categoriali. * ********************************************************************************* * Calcolo della distribuzione a posteriori: * Algoritmo Expectation Maximization (EM) che si basa sulla nozione di * stima di massima verosomiglianza del parametro incognito della distribuzione dei dati mancanti. * -- Fase di Previsione (Expectation) utilizza gli elementi del vettore delle medie * e la matrice di covarianza per costruire un insieme di equazioni di regressione * per prevedere i valori incompleti partendo dalle variabili osservate. * -- Fase di Massimizzazione (Maximization) utilizza i dati appena "creati" nella * fase E per aggiornare le stime del vettore delle medie e della matrice * di varianza e covarianza. Le nuove stime dei parametri vengono utilizzate nel passo E successivo. ********************************************************************************* * OPZIONI * burn-in iterations: numero di iterazioni prima della prima imputazione * in-between iterations: numero di iterazioni tra una imputazione e la successiva ********************************************************************************* set more off mi impute mvn maxgrip adl2 casp sphus /// = i.country wave hhsize gender age_int, rseed (53421) add(5) noisily ********************************************************************************* * Il problema è che abbiamo valori negativi e decimali. * Considerate che questo non è un problema di per sè, se l'imputazione riproduce * la correlazione e covarianza tra variabili che serve per il modello analitico ********************************************************************************* mi xeq 0 1 5: summarize maxgrip adl2 casp sphus mi xeq 0 1: tab sphus mi xeq 0 1: tab adl2 tsset iter Time variable: iter, -999 to 0 Delta: 1 unit . tsline wlf, ytitle(Worst linear function) xtitle(Burn-in period) ******************************************************************************* * * ANALYTICAL MODEL * /Pooling Phase * ******************************************************************************* *modello con i soli valori osservati/ completi mi xeq 0:regress casp adl maxgrip i.country wave gender age_int sphus *modello con i valori imputati nei 10 dataset mi estimate, dots: regress casp adl maxgrip i.country wave gender age_int sphus * il coef della Svezia passa da -0.36* a 0.04 n.s. * gli SE sono leggermente più grandi = stiamo aggiungendo * variabilità alle stime dovuta all'incertezza dei missing values /************************************************************ INFORMAZIONI SU VARIANZA E SE - Variance Between (VB): variabilità della stima dei parametri (dei coefficienti) tra i dataset imputati (meglio se vicino a 0) - Variance Within (VW): media aritmetica delle varianze campionarie tra i dataset imputati - Variance Total (VT): somma della VB (variabilità data dai missing) e VW (variabilità attesa), più una terza componente che è VB/m - Relative Increases in Variance (RVI): incremento della variaza dovuto ai missing - Fraction of Missing Information (FMI): % di varianza dovuta a quel fattore - Relative Efficiency: quanto stiamo stimando bene i parametri relativamente al numero di missing e il numero di imputazioni seconda tabella: - degrees of freedom che dipendono dal numero di missing in quella variabile - percentage the increase in standard errors: dovuto all'incremento di incertezza dato dai missing values *****************************************************************/ mi estimate, vartable dftable **************************************************************** **************************************************************** * * MODELLO DI IMPUTAZIONE * chained equations (MICE) * **************************************************************** * Non utilizziamo più la distribuzione normale (MVN) ma utilizziamo * distribuzioni condizionate separate per ogni variabile imputata. * Questo è necessario se abbiamo variabili da imputare con una natura * diversa (dummy -> logit; count -> Poisson). E' necessario se vogliamo * imputare valori plausibili ma non per riprodurre la matrice di covarianza. * * ************ * Una sequenza di imputazioni univariate con "fully conditional * specification (FCS)" di equazioni concatenate. * ****************************************************************** set more off mi impute chained (reg) maxgrip (logit) adl2 (reg) casp (ologit) sphus /// = i.country wave hhsize gender age_int, rseed (53421) replace noisily ******************* midiagplots casp midiagplots maxgrip midiagplots adl2 ****************** mi xeq 0 1 2 3 4 5 6 7 8 9 10: tab adl2 ******************************************************************************** * * ANALYTICAL MODEL * /Pooling Phase * ******************************************************************************** *modello con i soli valori osservati/ completi mi xeq 0:regress casp adl maxgrip i.country wave gender age_int sphus *modello con i valori imputati nei 10 dataset mi estimate, dots: regress casp adl maxgrip i.country wave gender age_int hhsize sphus *convergenza MICE set more off mi impute chained (reg) maxgrip (logit) adl2 (reg) casp (ologit) sphus /// = i.country wave hhsize gender age_int, rseed (53421) savetrace(impstats, replace) chainonly burnin(100) * Use the created dataset: use impstats, replace * Describe its content: des * Set it as time series: tsset iter * Time series line graphs for specific statistics: tsline maxgrip_mean, name(gr1) nodraw tsline maxgrip_sd, name(gr2) nodraw tsline casp_mean, name(gr3) nodraw tsline casp_sd, name(gr4) nodraw graph combine gr1 gr2 gr3 gr4, title(Trace plots of summaries of imputed values) rows(2) *********************************************************************************** *ALTRE OPZIONI: *1- possiamo includere age^2 *2- possiamo imputare shups condizionatamente alla seconda wave (un esempio sarebbe: *imputare il numero di sigarette per i fumatori *3- possiamo specificare una regressione OLS troncata per avere valori dentro un range. mi impute chained /// (regress, include((age_int^2)))) casp /// (ologit, conditional(if wave==2)) sphus /// (truncreg, ll(20) ul(84)) maxgrip = i.country wave hhsize gender age_int, add(5) rseed(27654)