我在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
答案 0 :(得分:0)
关于SPSS宏的事情是它无法与数据进行实际交互。它的唯一功能是创建并运行将与数据进行交互的语法。
像您这样写的命令:!LET !startMonth = NPER.
不起作用,因为您正试图跳过一步-此时,宏仅在创建语法,尚未读取数据,并且NPER
已除了四字母字符串外,对宏没有任何意义。
为了实际使DATE
函数根据数据中的值被动态调用,您应该创建依赖于数据的新语法。
一种方法是使用write
命令。
因此,例如,活动数据集具有这些变量NPER
和ANIO
,它们具有要在命令中使用的值,您可以执行以下操作:
write out='path\my date command.sps' /"DATE M " NPER " 12 Y " ANIO ".".
exe.
现在创建了语法(可以打开并检查),可以像这样运行它:
insert file='path\my date command.sps'.
请注意,write
命令将针对数据中的每种情况用该命令创建新行。如果您只想运行一次命令(假设NPER
和ANIO
的值在所有情况下都是相同的),则可以这样操作:
do if $casenum=1.
write out='path\my date command.sps' /"DATE M " NPER " 12 Y " ANIO ".".
end if.
exe.
当然,所有这些都可以轻松地集成到您的宏中,因此您可以绕过遇到的问题,并且仍然像以前一样使用宏的其余部分。