Получить всевозможные произведения пар переменных
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 90 91 92 93 94 95 96 97 98 | *(Вопрос) Мне нужно вычислить всевозможные комбинации векторных произведений среди группы переменных. То есть, надо найти произведения всех пар переменных, сохраняя каждый раз результат в новой переменной. В файле данных переменные идут одна за другой, так что, я думаю, можно как-то использовать функцию SPSS RANGE. Только не знаю как. А поскольку в моей матрице данных 168 переменных, умножать их поодиночке будет сложной задачей. * Может кто-нибудь предложить решение?. *(Ответ) Автор: rlevesque@videotron.ca. Размещено в SPSSX-L, 27.01.2002. *****************. * Часть A. * Создаются новые переменные для каждого произведения. * Проблема в том, что потом очень сложно будет использовать полученные переменные, так как у них нет никаких меток - где содержится результат перемножения конкретной пары переменных. * Часть B снимает эту проблему. *****************. * Создадим учебный массив данных с 5 переменными. * Метод работает для максимального числа переменных, поддерживаемых SPSS (где-то 32, 000) - для ранних версий (А.Б.). * То есть, начальное число переменных может быть где-то в районе 250 штук.. * Вам нужно будет поменять границы индексов и число векторных переменных (числа 4, 5, 10) в синтаксисе ниже таким образом, чтобы это соответствовало вашим данным. DATA LIST LIST /agecateg var2 crit19 cntry lastvarn. BEGIN DATA 1 2 3 4 5 6 2 5 1 3 6 4 2 5 1 4 7 3 2 5 8 9 6 1 END DATA. LIST. SAVE OUTFILE='c:\\temp\\mydata.sav'. * для n переменных существует (n-1)*n/2 векторных произведений. * Когда n=5, у нас будет 10 произведений, поэтому нам нужны будут 10 переменных (cp1 - cp10) для размещения результатов. VECTOR v=agecateg TO lastvarn /cp(10F8.0). COMPUTE #idx=1. LOOP #cnt1=1 TO 4. LOOP #cnt2=#cnt1 +1 TO 5. COMPUTE cp(#idx)=v(#cnt1)*v(#cnt2). COMPUTE #idx=#idx+1. END LOOP. END LOOP. EXECUTE. SAVE OUTFILE='c:\\temp\\mydata2.sav'. * Готово. *****************. * Часть B. * Посмотрим, как можно добавить к переменным cp осмысленные метки. *****************. GET FILE='c:\\temp\\mydata.sav'. * в данном случае нам потребуются только имена переменных, поэтому мы ограничим число наблюдений одним. N OF CASES 1. * Транспонируем. FLIP. * Теперь имена переменных сохранились в строковой переменной. Пронумеруем их. COMPUTE id=$CASENUM. * Нам нужно, чтобы имена переменных попали в одну строку. Определим вектор, который будет содержать имена. VECTOR vn(5A8). * Копируем каждую метку в соответствующую колонку. COMPUTE vn(id)=case_lbl. COMPUTE nobreak=1. * Теперь "сожмём" все наблюдения в одну строку. AGGREGATE /OUTFILE=* /BREAK=nobreak /vn1 TO vn5 = MAX(vn1 TO vn5). * Получим командный синтаксис с определением имён переменных. VECTOR v=vn1 TO vn5. STRING #deflab(A50). COMPUTE #idx=1. LOOP #cnt1=1 TO 4. LOOP #cnt2=#cnt1 +1 TO 5. COMPUTE #deflab=CONCAT( 'VARIABLE LABEL cp',LTRIM(STRING(#idx,F8.0)),' "', v(#cnt1),' * ',v(#cnt2),'".'). * Запишем команды в файл синтаксиса. WRITE OUTFILE='c:\\temp\\define var labels.SPS' /#deflab. COMPUTE #idx=#idx+1. END LOOP. END LOOP. EXECUTE. GET FILE='c:\\temp\\mydata2.sav'. INCLUDE 'c:\\temp\\define var labels.SPS'. FREQ ALL. |
Related pages
...