IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS STAT Discussion :

Séries chronologiques : décomposition de Beveridge Nelson


Sujet :

SAS STAT

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Séries chronologiques : décomposition de Beveridge Nelson
    Bonjour tout le monde,

    Je voulais savoir si quelqu'un pouvait m'aider pour faire la décomposition de Beveridge Nelson.

    Merci

  2. #2
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Hop

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    %MACRO BNelson(DATA=,OUT=,VAR=,DATE=,MAXPQ=,PAR=,QMA=,METHOD=,MAXITER=,
                   MCOEF=,MINMOD=,PRINT=,GRAPH=,CRAW=,CTREND=,CCYCLE=,DEBUG= );
     
     /************************************************************************/
     /* BNELSON: Cycle extraction with Beveridge-Nelson method.              */
     /************************************************************************/
     /* This macro implements the Beveridge-Nelson decomposition model of a  */
     /* time series into Trend and Cycle.                                    */
     /* The basic output is a SAS dataset with the series and its components.*/
     /* On request, you obtain some graphs.                                  */
     /*----------------------------------------------------------------------*/
     /* Author: Dominique LADIRAY (July 2001)                                */
     /************************************************************************/
     /* MACRO PARAMETERS                                                     */
     /************************************************************************/
     /*                                                                      */
     /* DATA    = SAS dataset containing the input time series. By default   */
     /*           the _LAST_ dataset is used.                                */
     /* OUT     = Output SAS dataset with the series and its components. By  */
     /*           default OUT=_result_. The components are named BN_Trendn   */
     /*           for the trend and BN_Cyclen for the cycle where n refers   */
     /*           to the ajusted ARIMA (p,1,q) model. In case several models */
     /*           are possible, a decomposition is done for each model (see  */
     /*           MAXPQ).                                                    */
     /* VAR     = The time series to be decomposed. It must be numeric.      */
     /* DATE    = This variable is used for the graphs and for the Ljung-Box */  
     /*           test for residuals. Therefore, it must be precised and     */
     /*           must be a SAS date variable (this point cannot be checked).*/
     /* MAXPQ   = You can ask for an automatic ajustment of the (p,1,q)      */
     /*           ARIMA model. The orders p and q will be determined with    */
     /*           the ESACF and SCAN method available in the ESTIMATE        */
     /*           statement of PROC ARIMA. MAXPQ precises the maximum value  */
     /*           of the orders p and q. If the parameters PAR or QMA and    */
     /*           MAXPQ are not specified, then an automatic modelling is    */
     /*           performed with MAXPQ=10.                                   */
     /* PAR     = In case you want to specify the (p,1,q) ARIMA model to be  */
     /*           ajusted, the parameter PAR= precises the order of the AR   */
     /*           part. PAR must be positive.                                */
     /* QMA     = In case you want to specify the (p,1,q) ARIMA model to be  */
     /*           ajusted, the parameter QMA= precises the order of the MA   */
     /*           part.                                                      */
     /*           PAR and QMA must be precised together otherwise an         */
     /*           automatic modelling is performed (see MAXPQ)               */
     /* METHOD  = The method to be used in the ARIMA estimation. Possible    */
     /*           values are CLS (the default), ULS and ML.                  */
     /* MAXITER = Maximum number of iteration in the estimation. By default  */
     /*           MAXITER=&maxiter.                                               */
     /* MCOEF   = The adjusted ARIMA model must be converted in a MA model.  */
     /*           MCOEF is the number of coefficients you require for the    */
     /*           MA model. By default MCOEF=100.                            */
     /* MINMOD  = The adjusted ARIMA model must be invertible. The roots of  */
     /*           the AR polynomial should be outside the unit circle.       */
     /*           MINMOD is the minimum value required for the modulus of    */
     /*           the roots. By default, MINMOD=0.98.                        */
     /* PRINT   = If YES, you get some printed output from the automatic     */
     /*           ARIMA modeling. By default PRINT=yes.                      */
     /* GRAPH   = If YES, you get some graphs of the components. By default, */
     /*           GRAPH=yes.                                                 */
     /* CRAW    = Color of the raw series. Default BLACK.                    */
     /* CTREND  = Color of the Trend. Default RED.                           */
     /* CCYCLE  = Color of the cycle. Default BLUE.                          */
     /*           For these last three options, use a valid SAS/Graph color. */
     /* DEBUG   = Debugging option                                           */
     /*                                                                      */
     /************************************************************************/
     /* REFERENCES :                                                         */
     /*  Beveridge S., Nelson C.R. (1981)                                    */
     /*  A New Approach to Decomposition of Economic Time Series into        */
     /*  Permanent and Transitory Components with Particular Attention to    */
     /*  Measurement of the 'Business Cycle'.                                */
     /*  Journal of Monetary Economics, 7, pages 151-174.                    */
     /************************************************************************/
     
     %IF (&debug NE) %THEN %DO;OPTIONS MPRINT NOTES;%END;
     
     /************************************************************************/
     /* SASNOM Macro, to check if a name is a valid SAS name                 */
     /************************************************************************/
     
     %MACRO sasnom(_IN_=,TYPE=);
      %GLOBAL _ret_;
      %LET _ret_=0;
      %IF &SYSVER < 7 %THEN %LET max=8;%ELSE %LET max=32;
      %LET table=%UPCASE(%TRIM(&_in_));
      %IF (%UPCASE(&type) EQ DATASET) %THEN %DO;
       %LET index=%INDEX(&table,.);
       %IF (&index GT 1) %THEN %DO;
        %LET lib=%SUBSTR(&table,1,&index-1);
        %LET table=%SUBSTR(&table,&index+1);
        %LET c1=%LENGTH(&lib);
        %LET c2=%VERIFY(%SUBSTR(&lib,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ');
        %LET c3=%VERIFY(&lib,'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
        %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1;
       %END;
      %END;
      %LET c1=%LENGTH(&table);
      %LET c2=%VERIFY(%SUBSTR(&table,1,1),'_ABCDEFGHIJKLMNOPQRSTUVWXYZ');
      %LET c3=%VERIFY(&table,'_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
      %IF ((&c1 > &max) OR (&c2 > 0) OR (&c3 > 0)) %THEN %LET _ret_=1;
     %MEND;
     
     /************************************************************************/
     /* Reading and checking of parameters                                   */
     /************************************************************************/
     
     /* Checking parameter data                                              */
     /************************************************************************/
     
     %IF (%LENGTH(&data ) EQ 0) %THEN %LET data = _last_ ;
     %ELSE %DO;
      %IF (%LENGTH(%QSCAN(%BQUOTE(&data ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the data  (&data ) parameter;
       %GOTO finmacro;
      %END;
      DATA _NULL_;
       SET &data (OBS=1);
      RUN;
      %IF (&syserr NE 0) %THEN %DO;
       %PUT ERROR: There is a problem in the data  (&data ) parameter;
       %PUT ERROR: Non valid SAS dataset? Non valid SAS name? ;
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter out                                               */
     /************************************************************************/
     
     %IF (%LENGTH(&out ) EQ 0) %THEN %LET out = _result_ ;
     %ELSE %DO;
      %IF (%LENGTH(%QSCAN(%BQUOTE(&out ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the out  (&out ) parameter;
       %GOTO finmacro;
      %END;
      %sasnom(_IN_=&out ,TYPE=DATASET);
      %IF (&_ret_ NE 0) %THEN %DO;
       %PUT ERROR: The out  (&out ) parameter must be a valid SAS dataset name;
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter var                                               */
     /************************************************************************/
     
     %IF (%LENGTH(&var ) EQ 0) %THEN %DO;
      %PUT ERROR: The var parameter must be precised;
      %GOTO finmacro;
     %END;
     %ELSE %DO;
      %IF (%LENGTH(%QSCAN(%BQUOTE(&var ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the var  (&var ) parameter;
       %GOTO finmacro;
      %END;
      DATA _NULL_;
       SET &data (KEEP=&var  OBS=1);
       ARRAY _xx_(*) &var ;
      RUN;
      %IF (&syserr NE 0) %THEN %DO;
       %PUT ERROR: There is a problem in the var  (&var ) parameter;
       %PUT ERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?;
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter date                                              */
     /************************************************************************/
     
     %IF (%LENGTH(&date ) EQ 0) %THEN %DO;
      %PUT ERROR: The date parameter must be precised;
      %GOTO finmacro;
     %END;
     %ELSE %DO;
      %IF (%LENGTH(%QSCAN(%BQUOTE(&date ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the date  (&date ) parameter;
       %GOTO finmacro;
      %END;
      DATA _NULL_;
       SET &data (KEEP=&date  OBS=1);
       ARRAY _xx_(*) &date ;
      RUN;
      %IF (&syserr NE 0) %THEN %DO;
       %PUT ERROR: There is a problem in the date  (&date ) parameter;
       %PUT ERROR: Non valid SAS dataset? Non valid SAS name? Wrong variable type? Non valid SAS list?;
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter maxpq                                             */
     /************************************************************************/
     
     %IF (%LENGTH(&maxpq ) EQ 0) %THEN %LET maxpq = 10 ;
     %ELSE %DO;
      %IF (%LENGTH(%QSCAN(%BQUOTE(&maxpq ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the maxpq  (&maxpq ) parameter;
       %GOTO finmacro;
      %END;
      %IF (%DATATYP(&maxpq ) EQ CHAR) %THEN %DO;
       %PUT ERROR: The maxpq  (&maxpq ) parameter must be numeric;
       %GOTO finmacro;
      %END;
      %ELSE %IF (&maxpq LE 0 ) %THEN %DO;
       %PUT ERROR: You must have &maxpq  > 0 ;
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter mcoef                                             */
     /************************************************************************/
     
     %IF (%LENGTH(&mcoef ) EQ 0) %THEN %LET mcoef = 100 ;
     %ELSE %DO;
      %IF (%LENGTH(%QSCAN(%BQUOTE(&mcoef ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the mcoef  (&mcoef ) parameter;
       %GOTO finmacro;
      %END;
      %IF (%DATATYP(&mcoef ) EQ CHAR) %THEN %DO;
       %PUT ERROR: The mcoef  (&mcoef ) parameter must be numeric;
       %GOTO finmacro;
      %END;
      %ELSE %IF (&mcoef LE 0 ) %THEN %DO;
       %PUT ERROR: You must have mcoef  > 0 ;
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter par                                               */
     /************************************************************************/
     
     %IF (%LENGTH(&par ) NE 0) %THEN %DO;
      %IF (%LENGTH(%QSCAN(%BQUOTE(&par ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the par  (&par ) parameter;
       %GOTO finmacro;
      %END;
      %IF (%DATATYP(&par ) EQ CHAR) %THEN %DO;
       %PUT ERROR: The par  (&par ) parameter must be numeric;
       %GOTO finmacro;
      %END;
      %ELSE %IF (&par LT 0 ) %THEN %DO;
       %PUT ERROR: You must have par  >= 0 ;
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter qma                                               */
     /************************************************************************/
     
     %IF (%LENGTH(&qma) NE 0) %THEN %DO;
      %IF (%LENGTH(%QSCAN(%BQUOTE(&qma ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the qma  (&qma ) parameter;
       %GOTO finmacro;
      %END;
      %IF (%DATATYP(&qma ) EQ CHAR) %THEN %DO;
       %PUT ERROR: The qma  (&qma ) parameter must be numeric;
       %GOTO finmacro;
      %END;
      %ELSE %IF (&qma LT 0 ) %THEN %DO;
       %PUT ERROR: You must have qma  >= 0 ;
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter method                                            */
     /************************************************************************/
     
     %IF (%LENGTH(&method ) EQ 0) %THEN %LET method = CLS;
     %ELSE %DO;
      %LET method=%UPCASE(&method);
      %IF (%LENGTH(%QSCAN(%BQUOTE(&method ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the method  (&method ) parameter;
       %GOTO finmacro;
      %END;
      %IF (%DATATYP(&method ) EQ NUM) %THEN %DO;
       %PUT ERROR: The method  (&method ) parameter must be character;
       %GOTO finmacro;
      %END;
      %ELSE %IF ((&method NE CLS) AND (&method NE ULS) AND (&method NE ML)) %THEN %DO;
       %PUT ERROR: The method  (&method ) parameter must be choosen among (CLS ULS ML);
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter maxiter                                           */
     /************************************************************************/
     
     %IF (%LENGTH(&maxiter ) EQ 0) %THEN %LET maxiter = 100 ;
     %ELSE %DO;
      %IF (%LENGTH(%QSCAN(%BQUOTE(&maxiter ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the maxiter  (&maxiter ) parameter;
       %GOTO finmacro;
      %END;
      %IF (%DATATYP(&maxiter ) EQ CHAR) %THEN %DO;
       %PUT ERROR: The maxiter  (&maxiter ) parameter must be numeric;
       %GOTO finmacro;
      %END;
      %ELSE %IF (&maxiter LE 0 ) %THEN %DO;
       %PUT ERROR: You must have maxiter  > 0 ;
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter print                                             */
     /************************************************************************/
     
     %IF (%LENGTH(&print ) EQ 0) %THEN %LET print = YES ;
     %ELSE %DO;
      %LET print=%UPCASE(&print);
      %IF (%LENGTH(%QSCAN(%BQUOTE(&print ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the print (&print) parameter;
       %GOTO finmacro;
      %END;
      %IF (%DATATYP(&print ) EQ NUM) %THEN %DO;
       %PUT ERROR: The print (&print) parameter must be character;
       %GOTO finmacro;
      %END;
      %ELSE %IF ((&print NE YES) AND (&print NE NO)) %THEN %DO;
       %PUT ERROR: The print (&print) parameter must be choosen among (YES NO);
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter graph                                             */
     /************************************************************************/
     
     %IF (%LENGTH(&graph ) EQ 0) %THEN %LET graph = YES ;
     %ELSE %DO;
      %LET graph=%UPCASE(&graph);
      %IF (%LENGTH(%QSCAN(%BQUOTE(&graph ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the graph (&graph) parameter;
       %GOTO finmacro;
      %END;
      %IF (%DATATYP(&graph ) EQ NUM) %THEN %DO;
       %PUT ERROR: The graph (&graph) parameter must be character;
       %GOTO finmacro;
      %END;
      %ELSE %IF ((&graph NE YES) AND (&graph NE NO)) %THEN %DO;
       %PUT ERROR: The graph (&graph) parameter must be choosen among (YES NO);
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter craw                                              */
     /************************************************************************/
     
     %IF (%LENGTH(&craw ) EQ 0) %THEN %LET craw = black ;
     %ELSE %DO;
      %IF (%LENGTH(%QSCAN(%BQUOTE(&craw ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the craw  (&craw ) parameter;
       %GOTO finmacro;
      %END;
      %IF (%DATATYP(&craw ) EQ NUM) %THEN %DO;
       %PUT ERROR: The craw  (&craw ) parameter must be character;
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter ctrend                                            */
     /************************************************************************/
     
     %IF (%LENGTH(&ctrend ) EQ 0) %THEN %LET ctrend = red ;
     %ELSE %DO;
      %IF (%LENGTH(%QSCAN(%BQUOTE(&ctrend ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the ctrend  (&ctrend ) parameter;
       %GOTO finmacro;
      %END;
      %IF (%DATATYP(&ctrend ) EQ NUM) %THEN %DO;
       %PUT ERROR: The ctrend  (&ctrend ) parameter must be character;
       %GOTO finmacro;
      %END;
     %END;
     
     /* Checking parameter ccycle                                            */
     /************************************************************************/
     
     %IF (%LENGTH(&ccycle ) EQ 0) %THEN %LET ccycle = blue ;
     %ELSE %DO;
      %IF (%LENGTH(%QSCAN(%BQUOTE(&ccycle ),2,%STR( ))) NE 0) %THEN %DO;
       %PUT ERROR: You must precise just one value for the ccycle  (&ccycle ) parameter;
       %GOTO finmacro;
      %END;
      %IF (%DATATYP(&ccycle ) EQ NUM) %THEN %DO;
       %PUT ERROR: The ccycle  (&ccycle ) parameter must be character;
       %GOTO finmacro;
      %END;
     %END;
     
     /************************************************************************/
     /* Some other controls                                                  */
     /************************************************************************/
     
     %LET erreur=0;
     DATA _NULL_;
      IF (INT(&mcoef ) ^= &mcoef ) THEN CALL SYMPUT('erreur','1');
      IF (INT(&maxpq ) ^= &maxpq ) THEN CALL SYMPUT('erreur','1');
      IF (INT(&maxiter ) ^= &maxiter ) THEN CALL SYMPUT('erreur','1');
      %IF (&par NE) %THEN %DO;
       IF (INT(&par ) ^= &par ) THEN CALL SYMPUT('erreur','1');
      %END;
      %IF (&qma NE) %THEN %DO;
       IF (INT(&qma ) ^= &qma ) THEN CALL SYMPUT('erreur','1');
      %END;
     RUN;
     %IF (&erreur EQ 1) %THEN %DO;
      %PUT ERROR: the parameters mcoef, par, qma and maxpq must be integer.
      %GOTO finmacro;
     %END;
     
     /************************************************************************/
     /* Controls end, Macro begins                                           */
     /************************************************************************/
     
     %IF (%UPCASE(&print) NE YES) 
       %THEN %LET print=noprint;
       %ELSE %LET print=;
     
     /* We check for missing values and compute the series periodicity.      */
     /************************************************************************/
     
     PROC FORMAT;
      VALUE njm
        25-35=12    50-70=6   80-100=4   115-135=3   175-195=2;
     RUN;
     
     %LET _miss_=0;
     DATA _trav_;
      SET &data END=fin;
      KEEP &date &var;
      RETAIN dtmin dtmax;
      IF (&var ^=.) THEN DO;
       ndon+1;
       dtmax=&date;
       IF (ndon=1) THEN dtmin=&date;
      END;
      IF ((&var ^= .) AND (LAG(&var) =.) AND (ndon > 1)) THEN CALL SYMPUT('_miss_','1');
      IF fin THEN DO;
       period=PUT((dtmax-dtmin)/ndon,njm.);
       CALL SYMPUT('period',period);
      END;
      IF (&var ^=.);
     RUN;
     %IF (&period EQ ) %THEN %DO;
      %PUT ERROR: Problem with the automatic determination of the series periodicity. Check your SAS date variable;
      %GOTO finmacro;
     %END;
     %IF (&_miss_ EQ 1) %THEN %DO;
      %PUT ERROR: Missing values in series &var;
      %GOTO finmacro;
     %END;
     
     /* Non automatic ARIMA modeling of the series.                          */
     /************************************************************************/
     
     %IF ((&par NE) AND (&qma NE)) %THEN %DO;
      DATA _bic_;
       Model=1;
       ar=&par;
       ma=&qma;
      RUN;
      %LET _nmod=1;
      %LET _maxar=&par;
      %LET _maxma=&qma;
      %LET _ar1=&par;
      %LET _ma1=&qma;
      PROC ARIMA DATA=_trav_;
       ODS SELECT NONE;
       ODS OUTPUT ChiSqAuto=ChiSq ParameterEstimates=ParEst;
       IDENTIFY VAR=&var(1);
       ESTIMATE P=&par Q=&qma METHOD=&method MAXITER=&maxiter;
       FORECAST ID=&date OUT=_arima_(KEEP=&date &var residual RENAME=(residual=Resid1)) LEAD=0;
      QUIT;
      ODS SELECT ALL;
     %END;
     
     /* Automatic ARIMA modeling of the series.                              */
     /************************************************************************/
     
     %ELSE %DO;
      PROC ARIMA DATA=_trav_;
       ODS SELECT NONE;
       ODS OUTPUT TentativeOrders=_bic_ ;
       IDENTIFY VAR=&var(1) P=&maxpq Q=&maxpq ESACF SCAN;
       RUN;
      QUIT;
      ODS SELECT ALL;
      %LET _ar=0;
      %LET _ma=0;
      DATA _bic_;
       SET _bic_(KEEP=scan_AR scan_MA RENAME=(scan_AR=ar scan_MA=ma))
           _bic_(KEEP=esacf_AR esacf_MA RENAME=(esacf_AR=ar esacf_MA=ma));
       KEEP ar ma sum;
       IF ar > 0;
       sum=ar+ma;
      RUN;
      PROC SORT DATA=_bic_ OUT=_bic_ NODUP;
       BY sum ma ar;
      RUN;
      %LET _nmod=0;
      DATA _bic_;
       LENGTH Model 8;
       RETAIN maxar maxma 0;
       SET _bic_;
       KEEP Model ar ma;
       model+1;
       maxar=MAX(ar,maxar);
       maxma=MAX(ma,maxma);
       CALL SYMPUT('_ar'||LEFT(PUT(model,3.)),LEFT(PUT(ar,2.)));
       CALL SYMPUT('_ma'||LEFT(PUT(model,3.)),LEFT(PUT(ma,2.)));
       CALL SYMPUT('_nmod',LEFT(PUT(model,3.)));
       CALL SYMPUT('_maxar',LEFT(PUT(maxar,3.)));
       CALL SYMPUT('_maxma',LEFT(PUT(maxma,3.)));
      RUN;
      %IF (&_nmod EQ 0) %THEN %DO;
       %PUT ERROR: No automatic model has been proposed by ESACF and SCAN options;
       %GOTO finmacro;
      %END;
     
      PROC ARIMA DATA=_trav_;
       ODS SELECT NONE;
       ODS OUTPUT ChiSqAuto=ChiSq ParameterEstimates=ParEst;
       IDENTIFY VAR=&var(1);
       %DO i=1 %TO &_nmod;
        ESTIMATE P=&&_ar&i Q=&&_ma&i METHOD=&method MAXITER=&maxiter;
    	FORECAST ID=&date OUT=for&i(KEEP=&date &var residual) LEAD=0;
       %END;
       RUN;
      QUIT;
      ODS SELECT ALL;
      DATA _arima_;
       MERGE
       %DO k=1 %TO &_nmod;
        for&k(RENAME=(residual=Resid&k))
       %END;
       ;
       BY &date;
       LABEL 
       %DO k=1 %TO &_nmod;
         resid&k=' ' forecast&k=' '
       %END;
       ;
      RUN;
     %END;
     
     /* We check now the validity of the ARIMA models.                       */
     /************************************************************************/
     
     DATA ParEst;
      SET ParEst;
      RETAIN model 0;
      IF Parameter=:'MU' THEN model=model+1;
      Parameter=SUBSTR(Parameter,1,2)||LEFT(PUT(Lag,3.));
     RUN;
     PROC TRANSPOSE DATA=ParEst(KEEP=Estimate Parameter Model) OUT=ParEst;
      BY model;
      ID Parameter;
     RUN;
     DATA ChiSq;
      LENGTH Lag $ 8;
      SET ChiSq;
      KEEP Lag ProbChiSq Model ToLags;
      RETAIN Model -1 n;
      IF (ToLags=6) THEN DO;
       model=model+1;
       n=0;
      END;
      LAG='PLjung';
      IF model > 0;
      IF df;
      IF (((&period=12) AND (ToLags=12)) OR ((&period^=12) AND (ToLags=6))
          OR ((n=0) AND (ToLags > &period))) 
       THEN DO;
        OUTPUT; 
        n=1;
      END;
     RUN;
     PROC TRANSPOSE DATA=ChiSq OUT=ChiSq;
      BY model;
      ID Lag;
      COPY ToLags;
     RUN;
     DATA ChiSq;
      SET ChiSq;
      LjungBox= (PLjung > 0.05); 
     RUN;
     
     %LET _selmod=0;
     DATA _bic_;
      RETAIN n 0;
      LENGTH Model 8 Arima $ 10;
      MERGE _bic_ ParEst ChiSq;
      DROP _NAME_ _LABEL_ n;
      BY Model;
      LABEL ar=' ' ma=' ';
      Arima=COMPRESS('('||PUT(ar,3.)||',1,'||PUT(ma,3.)||')');
      IF (LjungBox) THEN DO;
       IF (n=0) THEN CALL SYMPUT('_selmod',LEFT(PUT(Model,2.)));
       n=n+1;
       selmod='*';
      END;
     RUN;
     %IF (&print EQ) %THEN %DO;
      DATA _bic1_;
       LENGTH Arima $ 10 Selmod $1 LjungBox PLjung ToLags MU AR1-AR&_maxar MA1-MA&_maxma 8;
       SET _bic_(RENAME=(MU0=MU));
       ARRAY num{*} _NUMERIC_;
       DROP i model ar ma;
       DO i= 1 TO DIM(num);
        num(i)=ROUND(num(i),0.001);
       END;
      RUN;
      PROC TRANSPOSE DATA=_bic1_ OUT=_bic1_(DROP=_LABEL_) PREFIX=Model;
       VAR _all_;
      RUN;
      DATA _bic1_;
       SET _bic1_;
       DROP i;
       ARRAY model{*} $ model1-model&_nmod; 
       DO i= 1 TO DIM(model);
        model(i)=RIGHT(model(i));
       END;
       LABEL _name_=' ';
       RENAME _name_=Description;
      RUN;
      PROC PRINT DATA=_bic1_;
       ID Description;
       TITLE "Possible ARIMA models";
      RUN;
      TITLE;
     %END;
     %IF (&_selmod EQ 0) %THEN %DO;
      %PUT ERROR: No automatic model has been selected;
      %GOTO finmacro;
     %END;
     
     /* We compute Trend and Cycle estimates with PROC IML.                  */
     /************************************************************************/
     
     PROC IML;
      USE _bic_;
       READ all VAR{%DO i=1 %TO &_maxar; ar&i %END;} INTO ar;
       READ all VAR{%DO i=1 %TO &_maxma; ma&i %END;} INTO ma;
       READ all VAR{selmod} INTO selmod;
      CLOSE _bic_;
      USE _arima_;
       READ all VAR{&var} INTO y;
       READ all VAR{&date} INTO date;
       READ all VAR{%DO i=1 %TO &_nmod; Resid&i %END;} INTO r;
      CLOSE _arima_;
      model=LOC(selmod='*');
      nbmod=NCOL(model);
      noms=CONCAT(J(1,nbmod,'BN_Trend'),CHAR(model,4));
      noms=noms || CONCAT(J(1,nbmod,'BN_Cycle'),CHAR(model,4));
      noms=COMPRESS(noms);
      ar=J(nbmod,1,1)||(-ar)[model,];
      ma=J(nbmod,1,1)||(-ma)[model,];
      r=r[,model];
      nobs=NROW(r);
      npsi=&mcoef;
      psi=J(npsi+1,nbmod,.);
      cusum=J(npsi,nbmod,.);
      DO i=1 TO nbmod;
       cc=LOC(ar[i,]^=.);
       dd=LOC(ma[i,]^=.);
       psi[,i]=T(RATIO(ar[i,cc],ma[i,dd],npsi+1));
       psi2=psi[2:npsi+1,i];
       cusum[,i]=CUSUM(psi2[npsi:1])[npsi:1];
      END;
      cycle=J(nobs,nbmod,.);
      maxobs=MIN(npsi,nobs);
      DO i= nobs TO 2 BY -1;
       min=MIN(i,maxobs);
       rsub=r[i:MAX(i-min+1,2),];
       csub=cusum[1:NROW(rsub),];
       cycle[i,]=(rsub # csub)[+,];
      END;
      result=date || y || (REPEAT(y,1,nbmod)-cycle) || cycle;
      names={"&date" "&var"} || noms;
      CREATE &out FROM result[COLNAME=names];
       APPEND FROM result;
      CLOSE &out;
     QUIT;
     
     /* Graphs on request.                                                   */
     /************************************************************************/
     
     %IF (%UPCASE(&graph) EQ YES) %THEN %DO;
      %IF %SYSFUNC(CEXIST(&var)) %THEN %DO;
       PROC CATALOG C=&var KILL;
       QUIT;
      %END;
      DATA _NULL_;
       SET _bic_(WHERE=(selmod='*'));
       CALL SYMPUT('model'||LEFT(PUT(_N_,3.)),arima);
       CALL SYMPUT('trend'||LEFT(PUT(_N_,3.)),'BN_Trend'||LEFT(PUT(model,3.)));
       CALL SYMPUT('cycle'||LEFT(PUT(_N_,3.)),'BN_Cycle'||LEFT(PUT(model,3.)));
       CALL SYMPUT('nmod',LEFT(PUT(_N_,3.)));
      RUN;
      GOPTIONS  CBACK=white BORDER noDISPLAY DEVICE=win FTEXT=swissb noPROMPT;
      SYMBOL1 I=join COLOR=&craw WIDTH=1 VALUE=none ;
      SYMBOL2 I=join COLOR=&ctrend WIDTH=1 VALUE=none ;
      SYMBOL3 I=join COLOR=&ccycle WIDTH=1 VALUE=none ;
      AXIS1 LABEL=NONE;
      PROC GPLOT DATA=&out GOUT=&var UNIFORM;
       %DO i=1 %TO &nmod;
        PLOT &var*&date &&trend&i*&date /FRAME NAME="orig_s&i" VAXIS=axis1 OVERLAY;
        FORMAT &date MONYY5.;
        TITLE "Variable &var and Trend, model &&model&i";
        RUN;
        PLOT &&cycle&i*&date /FRAME NAME="cycle&i" VAXIS=axis1;
        FORMAT &date MONYY5.;
        TITLE "Cycle of variable &var, model &&model&i";
        RUN;
       %END;
      QUIT;
      GOPTIONS display;
      PROC GREPLAY IGOUT=&var TC=&var NOFS GOUT=&var;
       TDEF newtwo DES='two squares of equal size'
        1/LLX=1  LLY=50 ULX=1 ULY=99 URX=99 URY=100 LRX=99 LRY=50 color=grey
        2/LLX=1  LLY=1  ULX=1  ULY=50 URX=99  URY=50 LRX=99  LRY=1 color=grey
        ;
       TEMPLATE newtwo;
       %DO i=1 %TO &nmod;
        TREPLAY 1:orig_s&i 2:cycle&i;
        RUN;
       %END;
      QUIT;
      PROC GPLOT DATA= &out GOUT=&var UNIFORM;
       %DO i=1 %TO &nmod;
        PLOT &var*&date &&trend&i*&date /FRAME NAME="both&i" VAXIS=axis1 OVERLAY;
        PLOT2 &&cycle&i*&date /FRAME NAME="double&i" VAXIS=axis1;
        FORMAT &date MONYY5.;
        TITLE "Variable &var, Estimated Trend and Cycle, model &&model&i";
        RUN;
       %END;
       QUIT;
      TITLE;
      SYMBOL;
     %END;
     %finmacro:
     
    %MEND;
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  3. #3
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Tiens j'ai ça aussi :

    http://www.cpcug.org/user/sigstat/Po...s/UDetrend.pdf

    Interessant à lire dans un cadre macro-économique.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par datametric Voir le message
    Tiens j'ai ça aussi :

    http://www.cpcug.org/user/sigstat/Po...s/UDetrend.pdf

    Interessant à lire dans un cadre macro-économique.
    Merci beaucoup mais existe il une démarche sans passer par une macro?

  5. #5
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    pourquoi tu es allergique ?
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par datametric Voir le message
    pourquoi tu es allergique ?

    Non mais c'est pas simple de l'adapter à mon travail (selon moi).

Discussions similaires

  1. Séries Chronologiques sous R
    Par JoeBurtonn dans le forum R
    Réponses: 3
    Dernier message: 08/12/2014, 04h10
  2. Séries chronologiques avec R
    Par FavreMaxime dans le forum R
    Réponses: 2
    Dernier message: 29/05/2013, 13h24
  3. Réponses: 0
    Dernier message: 04/09/2012, 16h25
  4. Prévisions séries chronologiques
    Par id301077 dans le forum SAS STAT
    Réponses: 1
    Dernier message: 06/02/2012, 17h30
  5. Réponses: 0
    Dernier message: 06/01/2012, 10h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo