********************************************************************************* ********************************************************************************* * * FUZZY MERGE * ********************************************************************************* findit reclink2 ssc install reclink2 help reclink2 cd "G:\Il mio Drive\Multifonte" use sharew1_rel8-0-0_cv_r ************************************* * interview =1 intervistati che hanno * partecipato alla main interview ************************************* * missing = -1 (n=3) fre yrbirth if interview==1 * missing= -1 -2 (n= 45+301) fre mobirth if interview==1 * no missing fre gender if interview==1 ************************************** * DATA MANAGMENT ************************************** * creo variabili utili per il linkage * con lo stesso nome ************************************** clear use sharew1_rel8-0-0_dn *missing =-1 -2 (n=3) tab dn003_ gen yrbirth=dn003_ recode yrbirth(-2=-1) *missing = -1 -2 (n=268 +52) fre dn002_ gen mobirth=dn002_ recode mobirth(-2=-1) gen gender=dn042_ tab gender,mi gen interview=1 gen _mergeid=mergeid * quante persone all'interno delle famiglie * intervistate bys hhid: gen num=_n if interview==1 tab num gen ID=_n save dn_link, replace *********************************************** * coverscreen data *********************************************** use sharew1_rel8-0-0_cv_r *********************************************************** * * ESEMPIO 1 * *********************************************************** * USO ID FAMIGLIA * *********************************************************** * usando ID della famiglia, sesso e stato dell'intervista * gen(myscore) crea una variabile con le probabilità di linkage * idm e idu() sono gli ID identificativi dei casi nei 2 datasets * minscore() è la probabilità minima per cui accettiamo di linkare i casi * require() richiede che tutti i casi abbiamo un match esatto per ID famiglia * npairs() numero di casi da linkare nei 2 datasets * orblock() blocchi in cui cercare i match *********************************************************** gen id=_n reclink2 hhid1 gender interview using dn_link, /// gen(myscore) idm(id) idu(ID) minscore(.9) require(hhid1 interview) npairs(1) upr(_) ************************************************************ * RISULTATI ************************************************************ * myscore = probabilità del matching * quanti casi in cui ID individuo corrisponde * nei due datasets (281 casi di falsi match) ************************************************************ tab _merge myscore tab interview _merge,mi * in questo primo esempio utilizziamo l'ID dell'individuo * per mostrare i risultati del record linkage tab interview _merge if mergeid==_mergeid tab interview _merge if mergeid!=_mergeid * la probabilità di avere un abbinamento falso aumenta * all'aumentare delle dimensione del nucleo familiare bys hhid: gen num=_n if interview==1 bys hhid:egen num1=max(num) tab num1 _merge if mergeid!=_mergeid,row ************************************************************* * senza utilizzare mergeid possiamo vedere se l'anno di nascita * corrisponde nei due datasets (281 casi di match falsi) * l'anno di nascita in questo caso è una var utilizzata come * criterio esterno al record linkage ************************************************************** tab interview _merge if yrbirth!=dn003_ tab myscore _merge if yrbirth!=dn003_ & interview==1 tab dn003_ yrbirth if yrbirth!=dn003_ & interview==1 & _merge==3 gen nomatch=1 if _merge==3 & yrbirth!=dn003_ & interview==1 tab nomatch sort hhid1 ID br _mergeid mergeid gender _gender _hhid hhid yrbirth dn003_ num1 if nomatch==1 ************************************************************** ************************************************************** * * ID FAMIGLIA ************************************************************** * stiamo matchando gente che abita assieme e ha lo stesso sesso * ma abbiamo dei casi matchati falsi ************************************************************** * INTRODUCIAMO L'ANNO DI NASCITA ************************************************************** clear use sharew1_rel8-0-0_cv_r gen id=_n reclink2 hhid1 gender interview yrbirth using dn_link , /// gen(myscore) idm(id) idu(ID) minscore(.9) require(hhid1 interview) npairs(1) upr(_) tab interview _merge tab interview _merge if mergeid!=_mergeid tab _merge myscore gen nomatch=1 if mergeid!=_mergeid & interview==1 sort ID br _mergeid mergeid gender _gender _hhid hhid yrbirth mobirth relrpers myscore if nomatch==1 ***************************************************************************************** ***************************************************************************************** * * INTRODUCIAMO IL MESE DI NASCITA * * il mese di nascita peggiora il linkage, perchè? ****************************************************************************************** clear use sharew1_rel8-0-0_cv_r gen id=_n reclink2 hhid1 gender interview yrbirth mobirth using dn_link, /// gen(myscore) idm(id) idu(ID) minscore(.9) require(hhid1 interview ) npairs(1) upr(_) tab interview _merge tab interview _merge if mergeid!=_mergeid tab _merge myscore,mi gen nomatch=1 if _merge==1 & interview==1 sort ID br _mergeid mergeid gender _gender _hhid hhid yrbirth mobirth relrpers myscore if nomatch==1 *************************************************************** * PERCHè (1) la variabile mobirth contiene "rfusal" e "don't know" * che sono di più rispetto a dn002. *************************************************************** tab mobirth if interview==1,mi tab dn002 if interview==1,mi ************************************************************** * PERCHè (2) nel nostro modello di linkage un numero consistente * di individui ha una probabilità di linkage minore di 0.9 * dovuta al fatto che hanno mesi di nascita diversi o diverse * caratteristiche in altre variabili ************************************************************** ************************************************************* ************************************************************* * * ABBASSIAMO LO SCORE MINIMO PER TROVARE UN LINK * ************************************************************* * 6 FRATELLI NATI LO STESSO ANNO ************************************************************* clear use sharew1_rel8-0-0_cv_r, clear gen id=_n reclink2 hhid1 gender interview yrbirth mobirth using dn_link, /// gen(myscore) idm(id) idu(ID) minscore(.8) require(hhid1 interview) npairs(1) upr(_) *i match sono 30423 > n tab interview _merge ,mi tab _merge myscore * I doppioni (ossia doppi match) tab interview _merge if mergeid!=_mergeid bys hhid1 gender yrbirth mobirth: gen doppione=_n if interview==1 & _merge==3 tab doppione bys hhid1 gender yrbirth mobirth interview _merge: egen doppione2=max(doppione) tab doppione2 bys hhid1: egen doppione3=max(doppione) tab doppione3 br hhid1 gender _gender yrbirth _yrbirth mobirth _mobirth mergeid _mergeid myscore interview _interview if doppione3==2 & _merge==3 * un check usando l'ID dell'individuo gen nomatch=1 if mergeid!=_mergeid & interview==1 tab nomatch doppione2,mi sort ID br _mergeid mergeid gender _gender _hhid hhid yrbirth _yrbirth mobirth _mobirth relrpers myscore if nomatch==1 ************************************************************************* * NEL MODELLO PRECEDENTE ASSUMIAMO CHE L'ANNO DI NSCITA, MESE E GENERE * ABBIANO LO STESSO PESO NELL'IDENTIFICARE I MATCH ************************************************************************* ************************************************************************* ************************************************************************* * * INTRODUCIAMO I PESI * ************************************************************************* clear use sharew1_rel8-0-0_cv_r, clear gen id=_n reclink2 hhid1 gender interview yrbirth mobirth using dn_link, /// gen(myscore) idm(id) idu(ID) minscore(.8) wmatch(20 4 20 4 4) require(hhid1 interview ) npairs(1) upr(_) tab interview _merge tab interview _merge if mergeid!=_mergeid tab myscore gen nomatch=1 if mergeid!=_mergeid & interview==1 tab nomatch sort ID br _mergeid mergeid gender _gender _hhid hhid yrbirth _yrbirth mobirth _mobirth myscore if nomatch==1 ************************************ *non abbiamo migliorato il modello ************************************ *********************************************************************** *********************************************************************** * * INTRODUCIAMO I PESI CORRETTI * *********************************************************************** clear use sharew1_rel8-0-0_cv_r, clear /* gender = 52.6% F - 47.4% M = wm uguale a 3 (difficile che ci siano errori -> wnom = 10) yrbirth = range da 1901 a 2005 = wm uguale a 8 (ipotizziamo che ci siano errori -> wnom = 5) mobirth = range 1/12 = wm uguale a 5 (certo che ci siano errori -> wnom = 2) */ gen id=_n reclink2 hhid1 gender interview yrbirth mobirth using dn_link, /// gen(myscore) idm(id) idu(ID) minscore(.8) wmatch(20 3 20 7 5) wnomatch(10 10 10 5 2) require(hhid1 interview ) npairs(1) upr(_) tab interview _merge tab interview _merge if mergeid!=_mergeid gen nomatch=1 if mergeid!=_mergeid & interview==1 sort ID br _mergeid mergeid gender _gender _hhid hhid yrbirth _yrbirth mobirth _mobirth myscore if nomatch==1 *********************************************************************** *due gemelle svedesi nate a luglio 1935: *non c'è modo di identificarle in modo corretto se non avessimo un ID *dipende dal caso se riusciamo ad identificarle correttamente o no ***********************************************************************