Вложенные макросы в SPSS и команду! IF-! THEN с вычислением в качестве условия - PullRequest
1 голос
/ 20 марта 2020

Мне нужно сделать расчет за несколько лет. Конечно, я мог бы назвать макрос для каждого года отдельно. Однако я бы предпочел вызывать макрос только один раз и работать с дополнительными вложенными индексными циклами (!DO !var = x !TO y).

Теперь моя проблема заключается в том, что мне также необходимо условие! IF-! THEN, содержащее расчет: !IF (!year = !prev_year+1) !THEN Однако это кажется невозможным. Затем я написал вторую часть вычисления в дополнительном синтаксисе, который я вставил позже. Это работает, но не правильно. Ниже вы найдете синтаксис с примером.

DEFINE !change_hh (lastyear = !TOKENS(1) / lastyear_minus_1=!TOKENS(1) / bedingung = !TOKENS(1) / eyear = !TOKENS(1))
!DO !year= 2011 !TO !lastyear.
    !DO !prevyear= 2010 !TO !lastyear_minus_1.
    COMPUTE prevyear= !year-1.
    exe.
    ALTER TYPE prevyear (F4.0).
    DO IF $casenum = 1.
    WRITE OUTFILE=!QUOTE(!CONCAT("path\anyname_",!year,".sps"))
     /"DEFINE @bedingung() ", prevyear, " !ENDDEFINE.".
    END IF.
    EXE.  

    INSERT FILE = !QUOTE(!CONCAT("path\anyname_",!year,".sps")). 
        !IF (!prevyear= !EVAL(!bedingung)) !THEN
                COMPUTE !CONCAT("test_year_",!eyear) = !eyear.
                COMPUTE !CONCAT("test_prevyear_",!prevyear) = !prevyear.
                exe.
        !IFEND.
    !DOEND.
!DOEND.
EXE.
!ENDDEFINE.
!change_hh lastyear_minus_1 = 2014 lastyear= 2015 bedingung = @bedingung eyear = @jahr.

Я получаю только переменные test_year_2015 и test_prevyear_2014. Что не так? Я просто не понимаю Я думал, что это сначала работает с года = 2011 и проходит все предыдущие годы. После этого он работает с 2012 годом и снова проходит все предыдущие годы. И так далее.

1 Ответ

1 голос
/ 20 марта 2020

Макрос SPSS может использовать аргументы макроса только как (текстовые) строительные блоки для создания синтаксиса. Среди прочих ограничений это означает, что макрос не может выполнять математические операции над аргументами, как в !IF (!year = !prev_year+1) !then.

Другое ограничение макроса SPSS затрудняет l oop для двух отдельных массивов дат - что было бы естественным решением здесь ( см. Мой ответ здесь, чтобы узнать, как это сделать ).

STILL - вот возможное предложение о том, как получить тот же эффект:

define ....
.....
!let !prevyr="2010"
!do !year= 2011 !to !lastyear.
  ... use arguments !year and !prevyr ....
  !let !prevyr=!year
!doend

В этом l oop в конце каждой итерации аргумент !prevyr получает значение или !year аргумент и готов к следующей итерации.

...