如何在宏定义中使用数据值

时间:2019-08-09 18:03:40

标签: spss

我在SPSS SYNTAX脚本中有两个数据集。我需要根据第一个数据集内的值更改DATE命令值,因为此DATE命令会影响第二个数据集的TSMODEL,我该如何实现?

我想出了如何将数据集的名称动态更改为DO循环并在每种情况下构建正确的查询。但是到目前为止,我还无法动态更改DATE命令的值。

define @getDataPronos (arg1 !TOKENS(1) /arg2 !TOKENS(1)) 
!DO !J = !arg1 !TO !arg2 !BY 5.
/*FIRST DATASET GETTING JUST ONE RECORD WITH YEAR (ANIO), MONTH (NPER)
GET DATA
/TYPE=ODBC 
/CONNECT='DSN=SQLFinal;UID=;Trusted_Connection=Yes;APP=IBM SPSS Products: Statistics Common;WSID=CJFSPSS;DATABASE=GeoEstadistica'
/SQL= !QUOTE(!CONCAT('SELECT TOP 1 ANIO, NPER FROM pronos.dat_corid_',!J,' ORDER BY anio, nper'))
/ASSUMEDSTRWIDTH=255.
CACHE.
EXECUTE.

   !LET !startMonth = NPER.
   !LET !endMonth = 12.
   !LET !year = ANIO.

   DATASET NAME !CONCAT(PERIODO,!J) WINDOW=FRONT.
   DATASET ACTIVATE !CONCAT(PERIODO,!J).

/*SECOND DATASET PROCESSING TMODEL
   GET DATA 
     /TYPE=ODBC 
     /CONNECT='DSN=SQLFinal;UID=;Trusted_Connection=Yes;APP=IBM SPSS Products: Statistics Common;WSID=CJFSPSS;DATABASE=GeoEstadistica'
     /SQL= !QUOTE(!CONCAT('SELECT  CORID, TORID, PERLETRA, PROSID, CIRID, CIUID, MATID, MATERIA, ANIO, NPER, EXISTENCIAINICIAL, INGRESOS, EGRESOS, EXISTENCIAFINAL FROM Pronos.DAT_CorId_',!J, ' WHERE PROSID=0'))
     /ASSUMEDSTRWIDTH=255.
   CACHE.
   EXECUTE. 
   DATASET NAME !CONCAT(GRUPO,!J) WINDOW=FRONT.
   DATASET ACTIVATE !CONCAT(GRUPO,!J).
   SORT CASES  BY CORID. 
SPLIT FILE SEPARATE BY CORID.  
DATE M !startMonth !endMonth Y !year.

PREDICT THRU YEAR 2019 MONTH 12.
TSMODEL
   /MODELSUMMARY  PRINT=[MODELFIT]
   /MODELSTATISTICS  DISPLAY=YES MODELFIT=[ SRSQUARE RSQUARE RMSE MAPE MAE MAXAPE MAXAE NORMBIC]
   /MODELDETAILS  PRINT=[ FORECASTS]
   /OUTPUTFILTER DISPLAY=ALLMODELS
   /SAVE  PREDICTED(Pronosticado) LCL(LCI) UCL(LCS)
   /AUXILIARY  CILEVEL=95 MAXACFLAGS=24
   /MISSING USERMISSING=EXCLUDE
   /MODEL DEPENDENT=EXISTENCIAINICIAL INGRESOS EGRESOS EXISTENCIAFINAL
      PREFIX='Modelo'
   /EXPERTMODELER TYPE=[ARIMA EXSMOOTH] TRYSEASONAL=YES
   /AUTOOUTLIER  DETECT=OFF.
!DOEND
!enddefine.
@getDataPronos arg1=30 arg2=40

1 个答案:

答案 0 :(得分:0)

关于SPSS宏的事情是它无法与数据进行实际交互。它的唯一功能是创建并运行将与数据进行交互的语法。 像您这样写的命令:!LET !startMonth = NPER.不起作用,因为您正试图跳过一步-此时,宏仅在创建语法,尚未读取数据,并且NPER已除了四字母字符串外,对宏没有任何意义。
为了实际使DATE函数根据数据中的值被动态调用,您应该创建依赖于数据的新语法。
一种方法是使用write命令。 因此,例如,活动数据集具有这些变量NPERANIO,它们具有要在命令中使用的值,您可以执行以下操作:

write out='path\my date command.sps' /"DATE M " NPER " 12 Y " ANIO ".".
exe.

现在创建了语法(可以打开并检查),可以像这样运行它:

insert file='path\my date command.sps'.

请注意,write命令将针对数据中的每种情况用该命令创建新行。如果您只想运行一次命令(假设NPERANIO的值在所有情况下都是相同的),则可以这样操作:

do if $casenum=1.
   write out='path\my date command.sps' /"DATE M " NPER " 12 Y " ANIO ".".
end if.
exe.

当然,所有这些都可以轻松地集成到您的宏中,因此您可以绕过遇到的问题,并且仍然像以前一样使用宏的其余部分。