Несколько сравнений в каждом ряду - PullRequest
1 голос
/ 05 мая 2019

На SPSS у меня есть электронная таблица с более чем 6000 человек. Каждый человек прошел тест по крайней мере два раза и имеет по крайней мере два результата для того же теста. Некоторые люди сдали тест более двух раз. Возможно ли, чтобы SPSS проверил, проходят ли два теста в течение 6 месяцев и включают ли они результаты этих тестов рядом с человеком, и удалил все остальные результаты?

Структура данных

PersonNo  Test Date  Test Result  Test Date 2  Test result 2, Test Date 3, Test result 3
PersonNo 512, 23-Aug-18, 65, 22-May-18, 72

Проблема

PersonNo 98432, 09-Feb-18, 74, 06-Nov-18, 76, 10-Aug-18, 67
PersonNo 91203, 10-Dec-18, 75, 10-Sep-18, 65
PersonNo 75432, 01-Jan-18, 65, 01-Dec-18, 65

Как я хочу

PersonNo 98432, 09-Feb-18, 74, 10-Aug-18, 67
PersonNo 91203, 10-Dec-18, 75, 10-Sep-18, 65

Человек № 75432 удален, поскольку у него нет двух результатов теста в течение 6 месяцев

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Вместо двойного цикла и множественных сравнений я предлагаю реструктуризацию, которая позволяет сортировать и сравнивать только последовательные тесты.

Сначала я создаю небольшие поддельные данные для демонстрации на:

data list free/PersonNo (f6)   date1(Date11) score1(f3)    Date2(date11) score2 (f3)     Date3 (date11) score3(f3)   Date4 (date11) score4(f3).
begin data
98432, 09-Feb-18, 74, 06-Nov-18, 76, 10-Aug-18, 67, ,
91203, 10-Dec-18, 75, 10-Sep-18, 65, , , ,
75432, 01-Jan-18, 65, 01-Dec-18, 65, , , ,
12345, 19-Mar-18, 74, 26-Dec-19, 55, 10-Aug-18, 81, 19-Feb-19, 77
end data.

Теперь для актуальной задачи:

* first step - restructuring to long format.

varstocases /make date from date1 date2 date3 date4/make score from score1 score2 score3 score4.

* now it is possible to sort by test date, compare the dates and keep only the relevant ones.

sort cases by PersonNo date.
if $casenum>1 and PersonNo=lag(PersonNo) cond=DATEDIFF(date, lag(date), 'days') < 182.
create cond2=lead(cond,1).
select if cond or cond2.
exe.

* At this point you have only the relevant persons and tests left. 
You might continue your analysis in this structure, 
but if you want the following code gets you back to the original structure.

compute ind=1.
if $casenum>1 and PersonNo=lag(PersonNo) ind=lag(ind)+1.
format ind(f1).
casestovars /id=PersonNo /index=ind /drop cond cond2 /groupby=index /separator="".
1 голос
/ 06 мая 2019

Чтобы узнать, какие тесты были пройдены в течение 6 месяцев с переменной TestDate, вы можете использовать DATEDIFF(date1, date2, units).Поскольку неясно, сколько у вас полей TestDate, вы можете изменить порядок переменных, используя команду VECTOR для их циклического прохождения.

* assumes there are up to 11 tests each respondent may have taken.
VECTOR nextTestDate = TestDate2 TO TestDate 11 .
VECTOR nextTestResult = TestResult2 TO TestResult11 .
LOOP #i = 1 TO 10 .
* if not within 6 months then set date & result to sysmis .
DO IF (DATEDIFF(TestDate, nextTestDate(#i), 'days') > 182) .
  RECODE nextTestDate(#i) nextTestResult(#i) (ELSE = SYSMIS) .
END IF .
END LOOP .
EXE .

Вам не нужно делать это в VECTOR, если выесть только пара полей TestDate для проверки.Отсюда вы можете удалить любые переменные, в которых больше нет данных (это легко проверить с помощью DESC TestResult2 TO TestResult11).

...