****************************************************************************** ******************************************************************************* ******************************************************************************* * * UNIVARIATE IMPUTATION * L'imputazione è un insieme di valori plausibili che potrebbero * assumere i dati mancanti. * Univariata = abbiamo una sola variabile da imputare sulla base * di altre variabili osservate. * 1 - assumiamo di avere dei predittori che possano cogliere * i meccanismi generativi dei valori mancanti. * 2 - assumiamo che i missing siano at random (MAR). * 3 - il modello di imputazione deve contenere tutte le * variabili che utilizziamo nel modello analitico. ******************************************************************************* *********************************************************************** * SOLO per SEMPLIFICARE: *teniamo solo alcune variabili nel dataset *sostituzione con la media per adl limitations (per non avere missing) * solo per fini illustrativi *********************************************************************** keep maxgrip mergeid country wave gender age_int hhsize interview adl drop if interview!=1 | age_int<0 | age_int==. recode adl(min/-1=.) mean adl recode adl(.=.23) *abbiamo circa 6000 valori mancanti, circa il 9% misstable summarize misstable patterns maxgrip country wave gender age_int hhsize interview adl *possiamo anche vedere empiricamente se i missing sono MAR o MCAR gen miss=1 if maxgrip==. recode miss(.=0) *se non c'è nessuna associazione significativa possiamo assumere MCAR logit miss i.country wave gender age_int hhsize adl ************************************************************** * * IMPUTATION MODEL 1: * ************************************************************** * registrare la variabile da imputare (imputed) e i predittori (regular) * mlong = abbiamo individui ripetuti su più osservazioni * wide = le osservazioni sono individui diversi ************************************************************** mi set mlong mi register imputed maxgrip mi passive: gen age2 = age_int^2 mi register regular mergeid country wave gender age_int hhsize adl ************************************************************************* * * *********************** * IMPUTATION MODEL 1: OLS * *********************** * ************************************************************************* * facendo un modello di regressione ols per predire maxgrip * possiamo vedere se le assunzioni di linearità, omoschedasticità * e normalità sono rispettate ************************************************************************* hist maxgrip, normal regress maxgrip i.country wave gender age_int hhsize adl, *Checking Homoscedasticity of Residuals: residui plottati con valori predetti rvfplot, yline(0) avplot age_int avplot adl *per la distribuzione dei residui: checking normality predict r, resid kdensity r, normal ***************************************************************** ***************************************************************** * IMPUTAZIONE **************************************************************** * 20 nuovi dataset con valori plausibili per i missing * Alcuni autori sostengono che i nuovi dataset dovrebbero essere * tra 5 e 10 perchè aggiungerne di più ha pochi benefici (Schafer, 1999). ***** ***** * add = numero di dataset imputati * rseed = valori iniziali per la riproducibilità dei risultati * noisly = mostrare risultati intermedi ***************************************************************** mi impute regress maxgrip i.country wave gender age_int hhsize adl, add(20) rseed(2232) noisily ************************************************************* * DIAGNOSTICA ************************************************************* * guardiamo la distribuzione di maxgrip per i valori reali, * quelli imputati, e tutti assieme ************************************************************ *solo per la prima imputazione midiagplots maxgrip *solo per i primi sei dataset imputati midiagplots maxgrip, m(1/6) combine *histogramma per la prima imputazione midiagplots maxgrip, plottype(hist) separate ********************************************* * stime nei dataset 0 1 10 e 20 (per farci una idea di * come varia maxgrip) 2 variabili: * mi xeq richiama i diversi dataset imputati ********************************************* mi xeq 0 1 10 20: summarize maxgrip gender ************************************************ * mi_id : identificativo del caso/osservazione * mi_miss : gruppo valori imputati * mi_m : identificativo del dataset (da 0 a 20) * ********************************************** mi des tab _mi_id if maxgrip==. *il caso 5 list maxgrip age_int _mi_id _mi_miss _mi_m if _mi_id ==8 *il caso 8 list maxgrip age_int _mi_id _mi_miss _mi_m if _mi_id ==9 /* *test per vedere le differenze nelle distribuzioni tra i 20 dataset mi xeq 1 5 10 20: ksmirnov maxgrip, by(Miss) */ ************************************************************** * ora potremmo chiederci come cambiano le relazioni tra variabili * una volta che utilizziamo i dataset imputati piuttosto che quello osservato * potremmo convertire i dataset in wide format *************************************************************** *genero una variabile che distingua i missing per tutti i dataset qui mi xeq: generate byte Miss = missing(maxgrip) save ex_imputed, replace ******************************************************************* *prendiamo il caso dell'imputazione numero 2 * utilizziamo una regressione lineare e predict per i valori predetti ********************************************************************** mi extract 2 reg maxgrip i.country wave gender age_int adl hhsize, predict xb, xb **************************************************************** * al posto di una OLS (minimi quadrati) * utilizzo una running-mean smooth (lowess) * che utilizza diverse regressioni per stimare l'andamento medio **************************************************************** * grafico che mostra la relazione tra valori predetti da OLS * e i valori osservati e quelli imputati * linea rossa per i casi imputati e linea nera per quelli osservati **************************************************************** twoway /// (scatter maxgrip xb if Miss==0, msymbol(oh) color(gs12)) /// (scatter maxgrip xb if Miss==1, color(gs9)) /// (lowess maxgrip xb if Miss==0, color(black)) /// (lowess maxgrip xb if Miss==1, color(red)), /// ytitle(maxgrip) /// title(associazione bivariata per m=2) /// legend(label(1 "Observed") label(2 "Imputed") /// label(3 "Lowess (observed)") label(4 "Lowess (imputed)")) ******************************************** clear use ex_imputed ******************************************** * * ANALYTICAL MODEL * /Pooling Phase ******************************************** *modello con i soli valori osservati mi xeq 0:regress adl maxgrip i.country wave gender age_int *modello con i valori imputati nei 20 dataset mi estimate, dots: regress adl maxgrip i.country wave gender age_int **************************************************** * varianza between= variabilità stime nei 20 datasets * varianza within= media aritmetica degli standard error nei 20 datasets * varianza totale= somma di quella within + between + varianza campionaria * Relative Increases in Variance (RIV/RVI): % di incremento della varianza data * dai valori mancanti, ossia quella stimata dopo l'imputazione rispetto ai dati completi * FMI Fraction of Missing Information: % della varianza attribuibile dai dati mancanti * Relative efficency: è legata al numero di imputazioni rispetto al numero nei dati mancanti mi estimate, vartable dftable *valori predetti per la variabili country mimrgns country, cmdmargins ************************************************************** ************************************************************** * * IMPUTATION MODEL 2: OLS "TRONCATA" * ************************************************************** * non includiamo il numero di dataset perchè li stiamo sovrescrivendo * a quelli di prima con l'opzione replace * ll() ul() range in cui vogliamo che ricadano i valori imputati *************************************************************** mi impute truncreg maxgrip i.country wave gender age_int hhsize adl, replace ll(1) ul(92) rseed(2232) **************************************************************** * DIAGNOSTICA * la distribuzione dei valori imputati sembra migliore * perchè include solo numeri nel range indicato * MA la distribuzione è troncata tanti (troppi) valori attorno allo 0. **************************************************************** midiagplots maxgrip midiagplots maxgrip, plottype(hist) separate mi xeq 0 1 10 20: summarize maxgrip mi des list maxgrip age_int _mi_id _mi_miss _mi_m if _mi_id ==5 ********************************************** * Modello analitico pooled ********************************************** mi xeq 0:regress adl maxgrip i.country wave gender age_int mi estimate, dots: regress adl maxgrip i.country wave gender age_int mimrgns country, cmdmargins marginsplot, xlabel(,angle(45))