Регрессия на уровне наблюдений с записью коэффициентов в файл
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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | *ВОПРОС: Имеется набор данных, где для каждого человека шесть переменных содержат средний объём выпитого в день, когда употреблялся алкоголь, за шесть месяцев, следующих друг за другом. Т.е. наблюдения - люди. Мне требуется построить два регрессионных уравнения для каждого человека. Одно уравнение - линейная зависимость объёма выпитого от времени (т.е. от номера месяца), второе - квадратичная зависимость объёма выпитого от времени и времени в квадрате. Выражение 1: DDD = A0 + A1 * Time Выражение 2: DDD = A0 + A1 * Time + A2 * Time**2 Таким образом, мне нужно добавить к каждому человеку коэффициенты для каждого из уравнений. Я легко могу это сделать для Выражения 1, используя инструкции, которые можно найти в Cohen (или любом другом учебнике по регрессии). Но как подсчитать коэффициенты для Выражения 2. На тему пропущенных значений можно не думать. ***************************************************. *ОТВЕТ: * Добавляем в файл данных регрессионные коэффициенты к моделям на уровне наблюдений. * Размещено в SPSSX-L 03.02.2001. Автор: Raynald Levesque. * Создадим пример данных для иллюстрации (положим, имеется 5 наблюдений). INPUT PROGRAM. LOOP id=1 TO 5. VECTOR drink(6F8.0). LOOP #time=1 TO 6. COMPUTE drink(#time)=RND( UNIFORM(9)). END LOOP. END CASE. END LOOP. END FILE. END INPUT PROGRAM. LIST. SAVE OUTFILE='c:\\temp\\mydata.sav'. *Следующей строкой запрашиваем вывод развёрнутого макроса в окно результатов. SET MPRINT=yes. * Начинаем решать задачу. STRING newname(A8). * Следующий блок сработает как надо, если в файле данных меньше 10 000 000 наблюдений. * Транспонируем матрицу данных. COMPUTE newname=CONCAT('v',LTRIM(STRING($CASENUM,F7.0))). FLIP /newnames=newname. * Создадим 2 независимых переменных (IV), а также переменную selecvar чтобы не принимать * в расчёт наблюдения с номером человека. COMPUTE time1 = $casenum-1. COMPUTE selecvar=time1>0. COMPUTE time2 = time1**2. *//////////////////////////////////////////////. DEFINE !doit(nbvar=!TOKENS(1)) * Сохраняем параметры регрессионного уравнения для каждого наблюдения в отдельный файл. !DO !cnt=1 !TO !nbvar REGRESSION /SELECT= selecvar EQ 1 /MISSING LISTWISE /STATISTICS COEFF OUTS R ANOVA /CRITERIA=PIN(.05) POUT(.10) /NOORIGIN /DEPENDENT !CONCAT('v',!cnt) /METHOD=ENTER time1 time2 /OUTFILE=COVB( !QUOTE(!CONCAT('C:\\temp\\param',!cnt,'.sav'))) . !DOEND * Собираем все оценки параметров в единый файл. Оставляем только оценки. GET FILE= 'C:\\temp\\param1.sav'. !DO !cnt=2 !TO !nbvar ADD FILES FILE=* /FILE=!QUOTE(!CONCAT('C:\\temp\\param',!cnt,'.sav')) . !DOEND SELECT IF RTRIM(rowtype_)="EST". * затем добавляем их к исходному файлу. MATCH FILES /FILE=* /RENAME (depvar_ rowtype_ varname_ = d0 d1 d2) /FILE='C:\\Temp\\mydata.sav' /DROP= d0 d1 d2. EXECUTE. !ENDDEFINE. *//////////////////////////////////////////////. **** Вызываем макрос (измените число 5 на число наблюдений в файле). **** (Этот шаг тоже может быть автоматизирован если необходимо). !doit nbvar=5. |
Related pages
...