* Реорганизация данных об одновременных активностях испытуемых. * (Вопрос). Мы наблюдаем за испытуемыми и записываем их действия в течение дня. Фиксируется * время начала некоторой активности испытуемого, время окончания этой активности, тип (код) этой * активности, а также - набор переменных, характеризующих прочие наблюдаемые параметры. * Собранные данные имеют такой вид: № начало конец ТипАкт var 1 var2... ...varn День наблюд. 1 8:00:00 8:00:20 70 100 200 ....450 1 2 8:00:10 8:00:40 85 103 205 ...460 1 ... x 16:00:00 16:03:30 70 100 0 ...450 z Как видно, некоторые действия наблюдаемые могут выполнять одновременно (в "многозадачном" режиме), то есть, временные интервалы могут перекрываться, по крайней мере, частично. Кроме того, каждая активность может иметь свою длительность. Теперь хотелось бы преобразовать данные в матрицу "время/активность" следующим образом. Каждая строка должна относиться к одному моменту времени (моменты отдалены друг от друга на 5 секунд - определяется точностью фиксацией времени). Если в этот момент времени происходит более 1 активности (например, 2 или, в общем случае, y активностей), данные, относящиеся ко 2-й и последующим активностям следует расположить справа от данных, характеризующих первую активность. Например, в переменных, именованных как AT 2, var 2-1, var 2-2 to var 2-n (или ATy, var y-1, var y-2, var y-n для активности y). (Число активностей в один момент времени не может превосходить 4 (никто не может делать более 4 дел одновременно ;-), так что y<=4). Таким образом, результат преобразования должен выглядеть так. № время ТипАкт var 1 var2. ...varn AT2 var2-1 var2-2 var2-n 1 8:00:00 70 100 200 450 0 0 0 ...0 2 8:00:05 70 100 200 450 0 0 0 ...0 3 8:00:10 70 100 200 450 85 103 205 ...460 4 8:00:15 70 100 200 450 85 103 205 ...460 5 8:00:20 85 103 205 460 0 0 0 ...0 6 8:00:25 85 103 205 460 0 0 0 ...0 7 8:00:30 85 103 205 460 0 0 0 ...0 8 8:00:30 85 103 205 460 0 0 0 ...0 ... x16:03:25 70 100 0 450 0 0 0 ...0 *(Ответ) Автор: Ray. Размещён в SPSSX-L 21.07.2002. DATA LIST LIST /Nr(F8) stime etime(2TIME8) atype var1 var2 var3 var4 day(6F8.0). BEGIN DATA. 1 8:00:00 8:00:20 70 100 200 250 450 1 2 8:00:10 8:00:40 85 103 205 230 460 1 3 8:00:15 8:00:45 90 110 200 200 400 1 4 16:00:00 16:03:30 70 100 0 200 450 10 5 16:01:25 16:02:05 75 100 0 200 450 10 END DATA. LIST. COMPUTE #s=stime. * Далее предполагается, что максимальная продолжительность активности составляет 24 часа, * т.е. 24*60*60/5=17280. LOOP cnt=1 TO 17280. COMPUTE stime=#s. XSAVE OUTFILE='c:\\temp\\data1.sav' KEEP=stime atype var1 TO var4 . COMPUTE #s=#s + 5. END LOOP IF stime>=etime. EXECUTE. GET FILE='c:\\temp\\data1.sav'. SORT CASES BY stime atype. COMPUTE casen=$CASENUM. RANK VARIABLES=casen BY stime /RANK INTO idx. VECTOR at(4F8) /var1_(4F8) /var2_(4F8) /var3_(4F8) /var4_(4F8). COMPUTE at(idx)=atype. DO IF idx=1. + COMPUTE var1_1=var1. + COMPUTE var1_2=var2. + COMPUTE var1_3=var3. + COMPUTE var1_4=var4. ELSE IF idx=2. + COMPUTE var2_1=var1. + COMPUTE var2_2=var2. + COMPUTE var2_3=var3. + COMPUTE var2_4=var4. ELSE IF idx=3. + COMPUTE var3_1=var1. + COMPUTE var3_2=var2. + COMPUTE var3_3=var3. + COMPUTE var3_4=var4. ELSE IF idx=4. + COMPUTE var4_1=var1. + COMPUTE var4_2=var2. + COMPUTE var4_3=var3. + COMPUTE var4_4=var4. END IF. AGGREGATE /OUTFILE=* /BREAK=stime /at1 TO at4 = FIRST(at1 TO at4) /var1_1 TO var1_4 = FIRST(var1_1 TO var1_4) /var2_1 TO var2_4 = FIRST(var2_1 TO var2_4) /var3_1 TO var3_4 = FIRST(var3_1 TO var3_4) /var4_1 TO var4_4 = FIRST(var4_1 TO var4_4). COMPUTE nr=$CASENUM. ADD FILES FILE=* /KEEP=nr stime at1 var1_1 TO var1_4 at2 var2_1 TO var2_4 at1 var3_1 TO var3_4 at1 var4_1 TO var4_4.