Turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

- Home
- /
- Analytics
- /
- Forecasting
- /
- moving Average Model Bayesian in Proc MCMC

Options

- RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Mute
- Printer Friendly Page

🔒 This topic is **solved** and **locked**.
Need further help from the community? Please
sign in and ask a **new** question.

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

Posted 10-13-2021 04:17 PM
(508 views)

Moving average(1)

why the code is wrong?

```
proc mcmc data=dataset nmc=10000 seed=100 propcov=quanew;
parms theta;
parms sigma2 1;
prior theta ~ normal(0,sd=0.5);
prior sigma2 ~ igamma(shape = 3/10, scale = 10/3);
epsilon = y - mu;
mu = theta*epsilon.l1;
model y~normal(mu, var=sigma2);
preddist outpred=AR4outpred statistics=brief;
ods output PredSumInt=AR4PredSumInt;
run;
```

1 ACCEPTED SOLUTION

Accepted Solutions

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

Hello,

The problem with your code is that in the following lines:

```
epsilon = y - mu;
mu = theta*epsilon.l1;
```

The .l1 (lag 1 value) of a variable cannot be applied to a transformed variable, like epsilon in this case. You can use it on a data set variable, such as y, where as y.l1 is lag(1) of y. PROC MCMC knows how to look back the values of y according to an index (data index), but it doesn’t know what the lag of epsilon is going to be.

PROC MCMC can fit AR models for the reason that it can do y.l1 or y.l2. And now MA(1) = AR(Infinity), which makes it rather impractical to do with PROC MCMC. If you must use Bayesian analysis for the model in PROC MCMC, then you may need to construct an array of epsilons (of length T) to keep track of what the epsilon[t-1] values are in the likelihood calculation. Possible, but involving.

There are some alternatives you may consider. If you have SAS Viya license and SAS Econometrics license, then you can use PROC SMC to apply sequential Monte Carlo method to estimate your model. The sequential Monte Carlo methods (also known as particle filtering methods) provide simulation-based approximate solutions to the state space model (SSM), and have been widely used in economics, finance, science and engineering. An introduction to the functionalities in this procedure are provided here:

https://go.documentation.sas.com/doc/en/pgmsascdc/v_017/casecon/casecon_smc_overview.htm

More details on the sequential Monte Carlo methods are available here:

https://go.documentation.sas.com/doc/en/pgmsascdc/v_017/casecon/casecon_smc_details01.htm

In addition, you can also estimate MA models using traditional estimation methods like conditional least squares estimation, maximum likelihood estimation etc., which estimate MA models very well, using SAS/ETS procedures PROC ARIMA or PROC VARMAX with simple syntax.

Following is an example showing each of these procedures as alternatives to estimate an MA model which you may consider. Note that if you do not have SAS Viya and SAS Econometrics license, then you cannot run PROC SMC, but you can run the PROC ARIMA and PROC VARMAX steps if you have SAS/ETS license.

cas sascas1 ;

libname mycas cas sessref=sascas1 datalimit=all;

**data** one;

retain epslag **0**;

call streaminit('PCG', **12345**);

epslag = **0**;

do t = -**1000** to **200**;

eps = rand('normal');

y = -**0.6** + eps + epslag * **0.8**;

if(t>**0**) then output;

epslag = eps;

end;

**run**;

**data** mycas.one; set one; **run**;

**proc** **sgplot** data=one;

series x=t y=y;

**run**;

**proc arima** data = one ;

identify var = y ;

estimate q = 1 ;

forecast out = two ;

**run**;

**proc** **varmax** data=one;

model y / q=**1**;

output out = three ;

**run**;

**proc** **smc** data = mycas.one seed = **123** ;

id t;

var y ;

statevar eta;

parm mu=**0** theta = **0.5** sigma_sq = **0.8** ;

*initstate eta.L1 ~ degenerate(0);

initstate eta.L1 ~ normal(**0**,sqrt(sigma_sq));

initstate eta ~ normal(**0**,sqrt(sigma_sq));

state eta ~normal(**0**,sqrt(sigma_sq));

model y ~ normal(mu+eta+theta*eta.L1,**0.01**);

prior mu ~ normal(**0**,**10**);

prior theta ~ uniform(-**1**,**1**) ;

prior sigma_sq ~ igamma(**0.01**,**0.01**);

learn nparticle = **100000** algorithm=SIR

method = PMCMC(nsample = **1000** nbi=**50** samsum samset seed = **1**

thin=**1** outpost = sascas1.outle_ statistics=all

diagnostics(settings)=all sampler = rwm(ntu=**5** ntunestage=**48**)) ;

**run**;

I hope this helps!

1 REPLY 1

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

Hello,

The problem with your code is that in the following lines:

```
epsilon = y - mu;
mu = theta*epsilon.l1;
```

The .l1 (lag 1 value) of a variable cannot be applied to a transformed variable, like epsilon in this case. You can use it on a data set variable, such as y, where as y.l1 is lag(1) of y. PROC MCMC knows how to look back the values of y according to an index (data index), but it doesn’t know what the lag of epsilon is going to be.

PROC MCMC can fit AR models for the reason that it can do y.l1 or y.l2. And now MA(1) = AR(Infinity), which makes it rather impractical to do with PROC MCMC. If you must use Bayesian analysis for the model in PROC MCMC, then you may need to construct an array of epsilons (of length T) to keep track of what the epsilon[t-1] values are in the likelihood calculation. Possible, but involving.

There are some alternatives you may consider. If you have SAS Viya license and SAS Econometrics license, then you can use PROC SMC to apply sequential Monte Carlo method to estimate your model. The sequential Monte Carlo methods (also known as particle filtering methods) provide simulation-based approximate solutions to the state space model (SSM), and have been widely used in economics, finance, science and engineering. An introduction to the functionalities in this procedure are provided here:

https://go.documentation.sas.com/doc/en/pgmsascdc/v_017/casecon/casecon_smc_overview.htm

More details on the sequential Monte Carlo methods are available here:

https://go.documentation.sas.com/doc/en/pgmsascdc/v_017/casecon/casecon_smc_details01.htm

In addition, you can also estimate MA models using traditional estimation methods like conditional least squares estimation, maximum likelihood estimation etc., which estimate MA models very well, using SAS/ETS procedures PROC ARIMA or PROC VARMAX with simple syntax.

Following is an example showing each of these procedures as alternatives to estimate an MA model which you may consider. Note that if you do not have SAS Viya and SAS Econometrics license, then you cannot run PROC SMC, but you can run the PROC ARIMA and PROC VARMAX steps if you have SAS/ETS license.

cas sascas1 ;

libname mycas cas sessref=sascas1 datalimit=all;

**data** one;

retain epslag **0**;

call streaminit('PCG', **12345**);

epslag = **0**;

do t = -**1000** to **200**;

eps = rand('normal');

y = -**0.6** + eps + epslag * **0.8**;

if(t>**0**) then output;

epslag = eps;

end;

**run**;

**data** mycas.one; set one; **run**;

**proc** **sgplot** data=one;

series x=t y=y;

**run**;

**proc arima** data = one ;

identify var = y ;

estimate q = 1 ;

forecast out = two ;

**run**;

**proc** **varmax** data=one;

model y / q=**1**;

output out = three ;

**run**;

**proc** **smc** data = mycas.one seed = **123** ;

id t;

var y ;

statevar eta;

parm mu=**0** theta = **0.5** sigma_sq = **0.8** ;

*initstate eta.L1 ~ degenerate(0);

initstate eta.L1 ~ normal(**0**,sqrt(sigma_sq));

initstate eta ~ normal(**0**,sqrt(sigma_sq));

state eta ~normal(**0**,sqrt(sigma_sq));

model y ~ normal(mu+eta+theta*eta.L1,**0.01**);

prior mu ~ normal(**0**,**10**);

prior theta ~ uniform(-**1**,**1**) ;

prior sigma_sq ~ igamma(**0.01**,**0.01**);

learn nparticle = **100000** algorithm=SIR

method = PMCMC(nsample = **1000** nbi=**50** samsum samset seed = **1**

thin=**1** outpost = sascas1.outle_ statistics=all

diagnostics(settings)=all sampler = rwm(ntu=**5** ntunestage=**48**)) ;

**run**;

I hope this helps!

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. **Registration is now open through August 30th**. Visit the SAS Hackathon homepage.

Multiple Linear Regression in SAS

Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.

Find more tutorials on the SAS Users YouTube channel.