Агрегирование с медианой
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | * Решение 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). |