* Тема: Однофакторный дисперсионный анализ по сгруппированным данным (II): случай нескольких подмассивов в одном файле. * Ключевые слова: однофакторный, дисперсионный, сгруппированные, агрегированные, обобщенные, подмассив, подгруппа, MATRIX, SPLIT, INCLUDE, макрос. * Опубликован: ?, перевод: 27.10.2008. * Автор: Marta Garcia-Granero. * Перевод: А. Балабанов. * Размещение: http://www.spsstools.ru/Syntax/T-Test/ONEWAYwithSummaryDataI2.txt (.sps). * Проверено: SPSS 15.0.0. * Команды MATRIX...END MATRIX распознают включенное расщепление файла (SPLIT) только в пакетном режиме (через INCLUDE). * Переменная testnum определяет подмассивы, которые должны анализироваться отдельно друг от друга - примеч. перев. * (A) ПРИМЕР ДАННЫХ *. data list list/testnum(F4.0) groups(A8) n(F5.0) mean(F8.1) sd(F8.3). begin data 1 Control 10 62.8 6.9730 1 Respir 10 70.2 6.2147 1 Metabol 12 79.4 6.2397 1 Mixed 10 80.2 6.1065 2 Control 15 72.8 7.7703 2 Respir 15 80.4 7.3174 2 Metabol 15 89.4 7.4379 2 Mixed 15 90.2 8.1056 end data. * (B) СКОПИРУЙТЕ И СОХРАНИТЕ СЛЕДУЮЩИЙ СИНТАКСИС В ПАПКУ "C:\\Temp\\SummaryANOVA.sps". ******************** НАЧАЛО СИНТАКСИСА *******************. matrix. * Загрузка данных в матрицы *. get varnum /var=testnum. get names/var=groups. get n/var=n. get mean/var=mean. get sd/var=sd. print /title="-------------------------------------------". print varnum(1) /format="f8.0" /title="Расщепление файла:" /rlabel="Группа" * Основные вычисления *. compute k=nrow(n). compute totaln=msum(n). compute var=sd&**2. compute dfwithin=totaln-k. compute poolvar=msum((n-1)&*var)/dfwithin. * Проверки однородности дисперсий *. do if cmax(n)=cmin(n). print /title="Сбалансированный план. Возможны проверки Хартли и Кочрена". compute cochran=cmax(var)/msum(var). compute fmax=cmax(var)/cmin(var). print {cmax(var),cmin(var),fmax} /title="Проверка Fmax Хартли: см. таблицы критических значений" /format="f8.3" /clabels="Макс S^2","Мин S^2","Значение H". print cochran /title="Проверка Кочрена: см. таблицы критических значений" /format="f8.3" /clabel="Значение C". print (n(1)-1) /title="Число степеней свободы (DF) для всех групп" /format="f8.0". end if. print k /title="Число групп (K)" /format="f8.0". compute x2=dfwithin*ln(poolvar)-msum((n-1)&*ln(var)). compute cc=1+(msum(1/(n-1))-1/dfwithin)/(3*(k-1)). compute chi2=x2/cc. compute chisig=1-chicdf(chi2,k-1). print {chi2,chisig} /title="Проверка Бартлетта на однородность диспресий (df=K-1)" /format="f8.3" /clabels="Хи^2","Знач.". * Описательная статистика по выборкам и в целом *. compute gmean=(msum(n&*mean))/totaln. compute totsd=sqrt((msum((n-1)&*var+n&*(mean&**2))-(gmean&**2)*totaln)/(totaln-1)). compute eem=sd&/sqrt(n). compute toteem=totsd/sqrt(msum(n)). compute samplecv=100*sd/mean. compute totalcv=100*totsd/gmean. * 95% ДИ Альтамна для средних (используя внутригрупповые суммы квадратов и степени свободы вместо данных по каждой выборке) *. loop tvalue95=1960 to 12706. compute t95=tvalue95/1000. compute onetail=1-tcdf(t95,dfwithin). do if abs(onetail-0.025) lt 0.00005. break. end if. end loop. compute low95=mean-t95*sqrt(poolvar/n). compute upp95=mean+t95*sqrt(poolvar/n). compute lowgmean=gmean-t95*sqrt(poolvar/totaln). compute uppgmean=gmean+t95*sqrt(poolvar/totaln). * Вывод результатов *. compute names={names;'Total'}. print {n,mean,sd,samplecv,eem,low95,upp95;totaln,gmean,totsd,totalcv,toteem,lowgmean,uppgmean} /title="Описательные: 95% ДИ для средних (*) " /clabels='N','Среднее','SD','CV (%)','SE средн.','НГ','ВГ' /rnames=names /format='F7.2'. * Общий внутригрупповой (остаточный) коэффициент вариации (CV) *. compute cvar=100*sqrt(poolvar)/gmean. print cvar /title="Общий внутригрупповой коэффициент вариации (*)" /format="F5.2" /rlabels="CV (%)". print /title="(*) 95% ДИ Альтмана и внутригрупповые коэффициенты вариации основаны на предположении о равенстве дисперсий". * Запись данных в файл в матричном формате *. compute group=T({1:k}). MSAVE mean /TYPE=MEAN /fnames=group /factor=group /variable=depvar /snames=testnum /split=varnum /outfile=*. MSAVE sd /TYPE=STDDEV /fnames=group /factor=group /variable=depvar /snames=testnum /split=varnum /outfile=*. MSAVE n /TYPE=N /fnames=group /factor=group /variable=depvar /snames=testnum /split=varnum /outfile=*. print /title='Данные записаны в текущий файл в матричном формате'. end matrix. **************************** КОНЕЦ СИНТАКСИСА **************************. * (C) ТЕПЕРЬ "РАСЩЕПЛЯЕМ" ФАЙЛ ПО ПЕРЕМЕННОЙ "testnum" И ВЫЗЫВАЕМ СИНТАКСИС. set mxloop=30000. split file layered by testnum. include "C:\\Temp\\SummaryANOVA.sps". * Заключительным этапом будет выполнение однофакторного дисперсионного анализа для обоих подмассивов. * Если бы команда ONEWAY с матричными данными и включенным расщеплением файла работала нормально, то следующий синтаксис был бы решением данной задачи. ONEWAY depvar BY group /STATISTICS=DESCRIPTIVES WELCH /POSTHOC=TUKEY T2 /MATRIX=IN(*). *********************************************. * Но, поскольку это не работает (глюк SPSS?), решением будет следующий МАКРОС *. * Примеч. перев.: проверка синтаксиса в SPSS 15 показала, что указанная автором ошибка, вероятно, была исправлена разработчиком. Поэтому решение, приведённое выше, также работает. (D) ОПРЕДЕЛЕНИЕ МАКРОСА *. DEFINE !oneway (!POSITIONAL !TOKENS(1)). !DO !cnt=1 !TO !1. TEMPORARY. SELECT IF(testnum = !cnt). * Можете указать в подкоманде POSTHOC привычные вам апостериорные проверки. ONEWAY depvar BY group /STATISTICS=DESCRIPTIVES WELCH /POSTHOC=TUKEY T2 /MATRIX=IN(*). !DOEND. !ENDDEFINE. (E) ЗАПУСК МАКРОСА *. !oneway 2.