* Решение SPSS AnswerNet: 100006782.
* Агрегирование с медианой.
* С 14-й версии SPSS имеет функцию MEDIAN в команде AGGREGATЕ - примеч. перев.
DATA LIST FREE /id score.
BEGIN DATA
1 1 1 2 1 3 1 4 1 5
2 1 2 3 2 5 2 7 2 9
3 2 3 4 3 6 3 8 3 10
END DATA.
** Теперь мы агрегируем файл, группируя его по переменной id и сохраняя
число значений в каждой группе.
AGGREGATE OUTFILE 'c:\\temp\\aggmedian.sav'/
PRESORTED/ BREAK=id/ nscore=N(score).
** Теперь добавляем данные из агрегированного файла назад в исходный файл,
** вставляя по одному наблюдению в каждую группу id и помечая в
** переменной aggfile, что агрегированное наблюдение пришло из внешнего файла.
ADD FILES FILE 'c:\\temp\\aggmedian.sav'/IN=aggfile/FILE */BY id.
exe.
** Теперь раcщепляем файл по переменной id так, что последующие процедуры
** будут выполняться для каждой подгруппы id.
SPLIT FILE BY id.
** К этому моменту мы знаем, что переменная "score" имеет пропущенное значение
** (по крайней мере) для одного наблюдения в каждой подгруппе id; это значение у нас
** появилось после объединения исходного и агрегированного файла.
** Тогда мы можем использовать процедуру RMV (Replace Missing Values) для замены пропущенного значения
** медианой по переменной "score" (внутри соответствующей группы id, поскольку
** включено расщепление файла по id).
RMV medscore=MEDIAN(score, ALL).
** Нас интересуют те значения с медианой, которые помечены флагом в переменной
** "aggfile". Нам необходимо распространить медианные значения (medscore) каждой подгруппы
** на всю подгруппу.
IF id=LAG(id) medscore=LAG(medscore).
EXE.
** Теперь нет нужды сохранять наблюдения, добавленные после слияния исходного
** и агрегированного файлов. Уберём их из файла.
SELECT IF NOT(aggfile).
EXE.
** К этому моменту каждое наблюдение внутри каждой подгруппы id имеет
** в переменной "medscore" медиану для своей подгруппы.
** Если вам этого достаточно, можно отбросить вспомогательные переменные "nscore"
** и "aggfile" при следующем сохранении файла. Если вашей конечной целью
** было получить агрегированный файл с одним наблюдением для каждой
** подгруппы id с медианным значением этой подгруппы, сейчас вы имеете всё, что нужно.
** Сразу несколько функций команды AGGREGATE могут вернуть вам медианное значение,
** поскольку внутри каждой подгруппы id медиана в переменной "medscore" фактически является
** константой. Например, возьмём функцию MAX.
AGGREGATE OUTFILE * /BREAK=id/ aggmed=MAX(medscore).
**Примеч. перев. 1: если надо было получить только медианные значения (без одновременного
агрегирования со средним, минимумом, дисперсией и др. функциями), то после замены пропущенных
значений процедурой RMV достаточно было оставить в файле только наблюдения, помеченные aggrfile.
SELECT IF aggfile.
EXE.
**Примеч. перев. 2: в 14 и более поздних версиях SPSS к исходным данным для получения агрегирования
с медианой (наряду с другими функциями) достаточно выполнить, например:.
AGGREGATE OUTFILE * /BREAK=id/ aggmed=MEDIAN(score) /aggmean=MEAN(score) / aggmax=MAX(score).