Dopasuj Scalanie plików danych / modułów szkoleniowych SPSS
wprowadzenie
gdy masz dwa pliki danych, możesz je połączyć, scalając je obok siebie, dopasowując obserwacje na podstawie identyfikatora. Na przykład poniżej mamy plik zawierający dads i mamy plik zawierający faminc. Chcielibyśmy dopasować Scalanie plików razem, więc mamy obserwację dads na tej samej linii z obserwacją faminc opartą na kluczowej zmiennej famid.
dads famid name inc 2 Art 22000 1 Bill 30000 3 Paul 25000 faminc famid faminc96 faminc97 faminc98 3 75000 76000 77000 1 40000 40500 41000 2 45000 45400 45800
po połączeniu MATCH i faminc dane wyglądałyby tak.
famid name inc faminc96 faminc97 faminc98 1 Bill 30000 40000 40500 41000 2 Art 22000 45000 45400 45800 3 Paul 25000 75000 76000 77000
scalanie jeden do jednego
zacznijmy od utworzenia plików, które będziemy scalać. Poniżej tworzymy pliki.sav i faminc.sav.
DATA LIST LIST / famid * name (A4) inc.BEGIN DATA.2 Art 220001 Bill 300003 Paul 25000END DATA.LIST.SAVE OUTFILE = "dads.sav".DATA LIST LIST / famid faminc96 faminc97 faminc98.BEGIN DATA.3 75000 76000 770001 40000 40500 410002 45000 45400 45800END DATA.LIST.SAVE OUTFILE = "faminc.sav".
wynik tych instrukcji jest pokazany poniżej, potwierdzając, że poprawnie odczytaliśmy dane.
FAMID NAME INC 2.00 Art 22000.00 1.00 Bill 30000.00 3.00 Paul 25000.00FAMID FAMINC96 FAMINC97 FAMINC98 3.00 75000.00 76000.00 77000.00 1.00 40000.00 40500.00 41000.00 2.00 45000.00 45400.00 45800.00
istnieją trzy kroki, aby dopasować ojców merge.sav z faminc.sav. (Zauważ, że jest to połączenie jeden do jednego, ponieważ istnieje korespondencja jeden do jednego między rekordami dads i faminc.) Te trzy kroki są zilustrowane poniżej.
- użyj sort CASES do sortowania ojców na famid i zapisz ten plik (nazwiemy go dads2.sav)
- użyj sort CASES, aby posortować faminc na famid i zapisać ten plik (nazwiemy go faminc2.sav)
- użyj plików dopasowań do scalenia dads2.sav i faminc2.pliki sav oparte na famid
poniżej przedstawiamy polecenia do wykonania scalania.
GET FILE="dads.sav".SORT CASES BY famid.SAVE OUTFILE="dads2.sav".GET FILE="faminc.sav".SORT CASES BY famid.SAVE OUTFILE="faminc2.sav".MATCH FILES FILE="dads2.sav" /FILE="faminc2.sav" /BY famid.LIST.
wynik poniżej pokazuje, że scalanie dopasowań działało poprawnie.
FAMID NAME INC FAMINC96 FAMINC97 FAMINC98 1.00 Bill 30000.00 40000.00 40500.00 41000.00 2.00 Art 22000.00 45000.00 45400.00 45800.00 3.00 Paul 25000.00 75000.00 76000.00 77000.00
scalanie jeden do wielu
następny przykład rozważa scalanie jeden do wielu, gdzie jedna obserwacja w jednym pliku może mieć wiele pasujących rekordów w innym pliku. Wyobraźmy sobie, że mamy Plik z ojcami, jak widzieliśmy w poprzednim przykładzie, i mamy Plik z dziećmi, gdzie tata może mieć więcej niż jedno dziecko. Widzisz, dlaczego nazywa się to scaleniem jeden do wielu, ponieważ dopasowujesz jedną obserwację taty do jednej lub więcej (wielu) obserwacji dzieci. Pamiętajcie, że plik tatusiów jest plikiem z jedną obserwacją, a plik dzieci jest plikiem z wieloma obserwacjami. Poniżej tworzymy plik danych dla ojców i dla dzieci.
DATA LIST LIST / famid * name (A4) inc .BEGIN DATA.2 Art 220001 Bill 300003 Paul 25000END DATA.LIST.SAVE OUTFILE = "dads.sav".DATA LIST LIST / famid * kidname (A4) birth age wt * sex (A1).BEGIN DATA.1 Beth 1 9 60 f1 Bob 2 6 40 m1 Barb 3 3 20 f2 Andy 1 8 80 m2 Al 2 6 50 m2 Ann 3 2 20 f3 Pete 1 6 60 m3 Pam 2 4 40 f3 Phil 3 2 20 mEND DATA.LIST.SAVE OUTFILE="kids.sav".
jak widać poniżej, kroki dotyczące łączenia jeden do wielu są podobne do połączenia jeden do jednego, które widzieliśmy powyżej.
- użyj sort CASES BY aby posortować ojców na famid i zapisz ten plik (nazwiemy go dads2)
- użyj sort CASES BY aby posortować dzieci na famid i zapisz ten plik (nazwiemy go kids2)
- użyj MATCH FILES aby scalić pliki DADS2 i kids2. Ponieważ jednak plik dads jest plikiem z jedną obserwacją, użyj /TABLE = ” dads2.sav”, not / FILE = ” dads2.sav”, aby określić plik dads.
GET FILE="dads.sav".SORT CASES BY famid.SAVE OUTFILE="dads2.sav".GET FILE="kids.sav".SORT CASES BY famid.SAVE OUTFILE="kids2.sav".MATCH FILES FILE="kids2.sav" /TABLE="dads2.sav" /BY famid.LIST.
wynik poniżej pokazuje, że to połączenie działało zgodnie z naszą nadzieją.
FAMID KIDNAME BIRTH AGE WT SEX NAME INC 1.00 Beth 1.00 9.00 60.00 f Bill 30000.00 1.00 Bob 2.00 6.00 40.00 m Bill 30000.00 1.00 Barb 3.00 3.00 20.00 f Bill 30000.00 2.00 Andy 1.00 8.00 80.00 m Art 22000.00 2.00 Al 2.00 6.00 50.00 m Art 22000.00 2.00 Ann 3.00 2.00 20.00 f Art 22000.00 3.00 Pete 1.00 6.00 60.00 m Paul 25000.00 3.00 Pam 2.00 4.00 40.00 f Paul 25000.00 3.00 Phil 3.00 2.00 20.00 m Paul 25000.00
kluczową różnicą między scaleniem jeden do jednego i jednym do wielu jest to, że musisz użyć / TABLE= ” dads2.sav „zamiast / FILE=” dads2.sav”. W przypadku danych, gdy wykonujesz scalanie jeden do wielu, zadaj sobie pytanie, który plik odgrywa rolę jednego (w jednym do wielu). Dla tego pliku użyj /TABLE= zamiast / FILE=.
celowo popełnimy błąd i użyjmy / FILE= ” dads2.sav ” i zobacz co robi SPSS.
MATCH FILES /FILE="kids2.sav" /FILE="dads2.sav" /BY famid.LIST.
pierwszą rzeczą, którą zauważamy, jest to, że SPSS daje nam Ostrzeżenie pokazane poniżej. To mówi nam, że jest wiele dzieci dla danego taty.
Warning # 5132Duplicate key in a file. The BY variables do not uniquely identify eachcase on the indicated file. Please check the results carefully.
jak radzi SPSS, będziemy dokładnie sprawdzać wyniki. Rzeczywiście, widzimy, że wyniki nie są tym, czego chcieliśmy. Gdy na ojca przypadało wiele dzieci, to tylko połączyło ojca z pierwszym dzieckiem, a następnym dzieciom z tymi samymi ojcami przypisano brakujące wartości informacji o ojcach (imię i nazwisko). Kiedy w poprzednim przykładzie użyliśmy polecenia /TABLE=, SPSS przenosił informacje o ojcach przez wszystkie dzieci.
FAMID KIDNAME BIRTH AGE WT SEX NAME INC 1.00 Beth 1.00 9.00 60.00 f Bill 30000.00 1.00 Bob 2.00 6.00 40.00 m . 1.00 Barb 3.00 3.00 20.00 f . 2.00 Andy 1.00 8.00 80.00 m Art 22000.00 2.00 Al 2.00 6.00 50.00 m . 2.00 Ann 3.00 2.00 20.00 f . 3.00 Pete 1.00 6.00 60.00 m Paul 25000.00 3.00 Pam 2.00 4.00 40.00 f . 3.00 Phil 3.00 2.00 20.00 m .
kolejność zmiennych w Nowym pliku
możesz użyć polecenia /MAP z poleceniem Dodaj pliki, aby zobaczyć kolejność zmiennych w Nowym pliku, Jak pokazano poniżej. Jeśli chcesz zmienić kolejność zmiennych w Nowym pliku, możesz również dodać polecenie / zachowaj do polecenia Dodaj pliki. Zmienne zostaną uporządkowane w Nowym pliku w kolejności, w jakiej zostały wymienione w poleceniu / KEEP. Jeśli nie podasz wszystkich zmiennych w poleceniu / KEEP, zmienne Nie wymienione nie będą obecne w Nowym pliku. Zauważ również, że możesz wymienić kilka pierwszych zmiennych, jeśli tylko one wymagają zmiany kolejności, a następnie użyj słowa kluczowego ALL, aby dodać resztę zmiennych do nowego pliku. Zmienne Nie określone w poleceniu / KEEP pozostaną w kolejności, w jakiej znajdują się w oryginalnych plikach.
DATA LIST LIST / famid * name (A4) inc.BEGIN DATA.2 Art 220001 Bill 300003 Paul 25000END DATA.SAVE OUTFILE = "dads.sav".DATA LIST LIST / famid * name (A4) inc.BEGIN DATA.1 Bess 150003 Pat 500002 Amy 18000END DATA.SAVE OUTFILE = "moms.sav".ADD FILES FILE="dads.sav" /FILE="moms.sav" /KEEP = name ALL /MAP.EXECUTE.Map of the result fileResult Input1 Input2------ ------ ------NAME NAME NAMEFAMID FAMID FAMIDINC INC INC
jak widać, zmienne w Nowym pliku są teraz w nazwie kolejności, famid inc.
5.1 niedopasowanie rekordów w scalaniu jeden do jednego
dwa pliki danych mogą mieć rekordy, które nie pasują. Poniżej zilustrujemy to poprzez włączenie dodatkowego ojca (Karl w rodzinie 4), który nie ma odpowiedniej rodziny, oraz istnieją dwie dodatkowe rodziny (5 i 6) w aktach rodzinnych, które nie mają odpowiedniego ojca.
DATA LIST LIST / famid * name (A4) inc.BEGIN DATA.2 Art 220001 Bill 300003 Paul 250004 Karl 95000END DATA.SORT CASES BY famid.SAVE OUTFILE = "dads.sav".DATA LIST LIST / famid faminc96 faminc97 faminc98.BEGIN DATA.3 75000 76000 770001 40000 40500 410002 45000 45400 458005 55000 65000 700006 22000 24000 28000END DATA.SORT CASES BY famid.SAVE OUTFILE = "faminc.sav".MATCH FILES FILE="dads.sav" /IN=fromdad /FILE="faminc.sav" /IN=fromfam /BY famid.LIST.CROSSTABS /TABLES= fromdad BY fromfam.
jak widać powyżej, używamy / IN=fromdad do utworzenia zmiennej 0/1, która wskazuje, czy plik wynikowy zawiera rekord z danymi z pliku dads. Podobnie, używamy/IN = fromfam, aby wskazać, czy plik wynikowy ma rekord z pliku faminc. Lista i CROSSTABS następnie pokazują nam o niedopasowaniu rekordów.
wyjście z polecenia LIST pokazuje nam, że gdy doszło do niedopasowania rekordów. Dla rodziny 4 wartość fromdad wynosi 1, A fromfam wynosi 0, jak można by się spodziewać, ponieważ dla rodziny 4 były dane z rodziny 4, ale brak danych z rodziny 4. Ponadto, jak się spodziewamy, ten rekord ma poprawne dane dla zmiennych z pliku dads (Nazwa I inc) i brakujące dane dla zmiennych z faminc (faminc96 faminc97 i faminc98). Widzimy Odwrotny wzór dla famid 5 i 6.
FAMID NAME INC FAMINC96 FAMINC97 FAMINC98 FROMDAD FROMFAM 1.00 Bill 30000.00 40000.00 40500.00 41000.00 1 1 2.00 Art 22000.00 45000.00 45400.00 45800.00 1 1 3.00 Paul 25000.00 75000.00 76000.00 77000.00 1 1 4.00 Karl 95000.00 . . . 1 0 5.00 . 55000.00 65000.00 70000.00 0 1 6.00 . 22000.00 24000.00 28000.00 0 1
jeśli spojrzymy na zmienne fromdad i fromfam, zobaczymy, że istnieją trzy rekordy, które mają pasujące DANE, jeden, który ma DANE tylko z dads i dwa rekordy, które mają DANE tylko z pliku faminc. Poniższy crosstab pokazuje nam te same wyniki i jest łatwiejszym sposobem liczenia dopasowania niż ręcznego liczenia dopasowania.
FROMDAD by FROMFAM FROMFAM Page 1 of 1 Count | | | Row | 0| 1| TotalFROMDAD --------+------+------+ 0 | | 2| 2 | | | 33.3 +------+------+ 1 | 1| 3| 4 | | | 66.7 +------+------+ Column 1 5 6 Total 16.7 83.3 100.0
podczas dopasowywania plików sugerujemy użycie tej strategii do sprawdzenia dopasowania dwóch plików. Jeśli występują nieoczekiwane niedopasowane rekordy, powinieneś zbadać, aby zrozumieć przyczynę niedopasowanych rekordów.
możesz użyć SELECT IF, aby wyeliminować niektóre niepasujące rekordy. Na przykład, jeśli chcesz zachować tylko rekordy, w których ojcowie pasują do informacji o rodzinie, możesz wpisać
SELECT IF fromdad AND fromfam.LIST.
wyniki są pokazane poniżej, w tym tylko trzy pasujące rekordy.
FAMID NAME INC FAMINC96 FAMINC97 FAMINC98 FROMDAD FROMFAM 1.00 Bill 30000.00 40000.00 40500.00 41000.00 1 1 2.00 Art 22000.00 45000.00 45400.00 45800.00 1 1 3.00 Paul 25000.00 75000.00 76000.00 77000.00 1 1
5.2 niedopasowanie rekordów w scalaniu jeden do wielu
SPSS obsługuje włączenie niedopasowanych rekordów w scalaniu jeden do wielu inaczej niż scalanie jeden do jednego. Pamiętaj, że w scalaniu jeden do wielu istnieje plik, który ma jedną obserwację, która pasuje do wielu obserwacji w innym pliku; odnośmy się do nich jako do jednego pliku i do wielu plików. Jeśli w pliku one znajdują się obserwacje, które nie pasują do pliku many, to obserwacje te w ogóle nie pojawią się w scalonym pliku. Jeśli w pliku wiele znajdują się obserwacje, które nie pasują do jednego pliku, te rekordy pojawią się w scalonym pliku. Jeśli tego chcesz, możesz scalić pliki, jak pokazano w sekcji 3,i użyć / IN=, Jak pokazano w poprzedniej sekcji, aby śledzić dopasowanie. Jeśli jednak chcesz, aby niedopasowane rekordy z pliku one I many pojawiały się w scalonym pliku, możesz użyć strategii dopasowania opisanej poniżej.
poniżej używamy naszego przykładu do scalania ojców z dziećmi, w tym przykładzie mamy niedopasowane rekordy w obu plikach. Poniżej dopasowujemy pliki tak, aby zawierały wszystkie niedopasowane rekordy w scalonym pliku. Części, które są różne, są oznaczone na Czerwono.
DATA LIST LIST / famid * name (A4) inc.BEGIN DATA.2 Art 220001 Bill 300003 Paul 250004 Karl 95000END DATA.SAVE OUTFILE = "dads.sav".DATA LIST LIST / famid * kidname (A4) birth age wt * sex (A1).BEGIN DATA.1 Beth 1 9 60 f1 Bob 2 6 40 m1 Barb 3 3 20 f2 Andy 1 8 80 m2 Al 2 6 50 m2 Ann 3 2 20 f3 Pete 1 6 60 m3 Pam 2 4 40 f3 Phil 3 2 20 m5 Ted 1 4 35 m5 Tess 2 2 18 fEND DATA.SAVE OUTFILE="kids.sav".GET FILE="kids.sav".SORT CASES BY famid.SAVE OUTFILE="kids2.sav".GET FILE="dads.sav".SORT CASES BY famid.SAVE OUTFILE="dads2.sav".SAVE OUTFILE="dadid.sav" /KEEP=famid.MATCH FILES FILE="kids2.sav" /IN=inkid /FILE="dadid.sav" /BY famid .LIST.SAVE OUTFILE="temp.sav".MATCH FILES FILE="temp.sav" /TABLE="dads2.sav" /IN=dads /BY famid.LIST.
sekcja w kolorze czerwonym dodaje dodatkowy krok do dopasowania. Celem tego kroku jest dodanie dowolnych wartości famid, które są tylko w pliku dads do pliku kids. Robi to, wykonując połączenie jeden do jednego między dadid i dziećmi i zapisuje ten plik jako tymczasowy. Ponieważ dadid tylko famid wszystkich ojców, to połączenie w zasadzie dodaje obserwacje dla każdego famid, który jest w pliku dads, ale nie w pliku kids, i zapisuje to jako tymczasowe. Następnie możemy scalić temp z dads2 i temp będzie miał famid dla każdej obserwacji w pliku dads2. Zapewnia to, że wynikowy plik będzie zawierał wszystkie obserwacje z pliku dads, nawet jeśli nie mają pasującego rekordu w pliku kids. Wynik pokazano poniżej. Rzeczywiście, plik zawiera obserwację dla ojca Karla, który nie ma pasujących dzieci. Jeśli pominiemy dodatkowy kod w tym kroku, ten rekord nie zostanie uwzględniony w tym pliku.
FAMID KIDNAME BIRTH AGE WT SEX INKID NAME INC DADS 1.00 Beth 1.00 9.00 60.00 f 1 Bill 30000.00 1 1.00 Bob 2.00 6.00 40.00 m 1 Bill 30000.00 1 1.00 Barb 3.00 3.00 20.00 f 1 Bill 30000.00 1 2.00 Andy 1.00 8.00 80.00 m 1 Art 22000.00 1 2.00 Al 2.00 6.00 50.00 m 1 Art 22000.00 1 2.00 Ann 3.00 2.00 20.00 f 1 Art 22000.00 1 3.00 Pete 1.00 6.00 60.00 m 1 Paul 25000.00 1 3.00 Pam 2.00 4.00 40.00 f 1 Paul 25000.00 1 3.00 Phil 3.00 2.00 20.00 m 1 Paul 25000.00 1 4.00 . . . 0 Karl 95000.00 1 5.00 Ted 1.00 4.00 35.00 m 1 . 0 5.00 Tess 2.00 2.00 18.00 f 1 . 0
5.3 zmienne o tej samej nazwie, ale różne informacje
poniżej mamy pliki z informacjami o ojcach i rodzinie, ale przyjrzyjmy się bliżej nazwom zmiennych. W pliku dads znajduje się zmienna o nazwie inc98, a w pliku rodzinnym zmienne inc96, inc97 i inc98. Połączmy te pliki i zobaczmy, co robi SPSS.
DATA LIST LIST / famid * name (A4) inc98.BEGIN DATA.2 Art 220001 Bill 300003 Paul 25000END DATA.SAVE OUTFILE = "dads.sav".DATA LIST LIST / famid inc96 inc97 inc98.BEGIN DATA.3 75000 76000 770001 40000 40500 410002 45000 45400 45800END DATA.SAVE OUTFILE = "faminc.sav".GET FILE="dads.sav".SORT CASES BY famid.SAVE OUTFILE="dads2.sav".GET FILE="faminc.sav".SORT CASES BY famid.SAVE OUTFILE="faminc2.sav".MATCH FILES FILE="dads2.sav" /FILE="faminc2.sav" /BY famid.LIST.
wyniki przedstawiono poniżej. Jak widzisz, zmienna inc98 zawiera dane z pliku dads, pliku, który pojawił się jako pierwszy w poleceniu MATCH FILES. Gdy dopasujesz pliki, które mają tę samą zmienną, SPSS użyje wartości z pliku, który pojawia się najwcześniej w poleceniu dopasuj pliki.
FAMID NAME INC98 INC96 INC97 1.00 Bill 30000.00 40000.00 40500.00 2.00 Art 22000.00 45000.00 45400.00 3.00 Paul 25000.00 75000.00 76000.00
istnieje kilka sposobów rozwiązania tego problemu.
rozwiązanie #1. Najbardziej oczywistym rozwiązaniem jest wybranie nazw zmiennych w oryginalnych plikach, które nie będą ze sobą kolidować. Możesz jednak otrzymać pliki, w których nazwy zostały już wybrane.
Rozwiązanie # 2. Możesz zmienić nazwy zmiennych w poleceniu dopasuj pliki (które zmienia nazwy zmiennych przed wykonaniem dopasowania). Pozwala to na wybranie nazw zmiennych, które nie są ze sobą sprzeczne, jak pokazano poniżej.
GET FILE="dads.sav".SORT CASES BY famid.SAVE OUTFILE="dads2.sav".GET FILE="faminc.sav".SORT CASES BY famid.SAVE OUTFILE="faminc2.sav".MATCH FILES FILE="dads2.sav" /RENAME=(inc98 = dadinc98) /FILE="faminc2.sav" /RENAME=(inc96 inc97 inc98 = faminc96 faminc97 faminc98) /BY famid.LIST.
jak widać poniżej, zmienne zostały nazwane tak, jak podaliśmy.
FAMID NAME DADINC98 FAMINC96 FAMINC97 FAMINC98 1.00 Bill 30000.00 40000.00 40500.00 41000.00 2.00 Art 22000.00 45000.00 45400.00 45800.00 3.00 Paul 25000.00 75000.00 76000.00 77000.00
5.4 te same zmienne z różnymi informacjami o słowniku
ten problem jest podobny do tego opisanego powyżej. W tym przykładzie mamy dwie zmienne o tej samej nazwie i tej samej informacji, ale z powiązanymi z nimi różnymi informacjami słownikowymi. Te informacje słownikowe mogą zawierać etykiety wartości i / lub etykiety zmiennych. Podobnie jak w powyższym przykładzie, SPSS pobierze informacje z pliku wymienionego jako pierwszy w poleceniu MATCH FILES. Nie zostanie wysłany żaden komunikat o błędzie ani ostrzeżeniu informujący, że informacje ze zmiennej w późniejszym Pliku zostały utracone. Rozwiązaniem tego problemu jest najpierw lista w poleceniu MATCH FILES pliku z informacją słownikową, którą chcesz w pliku wynikowym.
5.5 uruchomiłeś polecenie Dodaj pliki i nic się nie stało
jeśli uruchomisz tylko polecenie Dodaj pliki, jak pokazano poniżej, SPSS nic nie zrobi. Jednak w prawym dolnym rogu edytora danych pojawi się notatka z napisem „transformation pending”.
ADD FILES FILE="dads.sav" /FILE="moms.sav"
rozwiązanie: rozwiązaniem jest dodanie polecenia execute lub polecenia procedury, które wymusi wykonanie transformacji, takiego jak polecenie list lub polecenie crosstab.
ADD FILES FILE="dads.sav" /FILE="moms.sav"execute.