QUANTILE

Questions and discussions on Vector Autoregressions
comac
Posts: 25
Joined: Mon Jun 29, 2009 7:31 am

QUANTILE

Unread post by comac »

Dear all,

In the code below I am computing some different betas (say beta1 and beta2) from bootstrapped-VAR residuals. How can I obtain quantiles for beta1 and beta2?

Code: Select all

@VARBootSetup(model=varmodel) bootvar
*
compute rstart=%regstart()
compute rend  =%regend()
*
compute bootdraws=2000
compute nvar  =3
compute nsteps=8
*
dec vect[rect] beta1(bootdraws)
dec vect[rect] beta2(bootdraws)
*
infobox(action=define,progress,lower=1,upper=bootdraws) $
   "Bootstrap Simulations"
do draw=1,bootdraws
   @VARBootDraw(model=varmodel,resids=resids) rstart rend
   *
   * Estimate the model with resampled data
   *
   estimate(noprint,noftests)
   ....instructions.....
  compute beta1 = [....instructions.....]
  compute beta2 = [....instructions.....]
end do draw
infobox(action=remove)
Following the User's Guide, Chpt. 13 I have inserted in the code and hence in the loop:

Code: Select all

dec vect[rect] sims(bootdraws)
….
compute sims(draw) = beta1(draw)
….
compute fract=%fractiles(sims,||.25,.75||)
the simulation works just fine, but then I get the following error message :

Can't Find Match for %FRACTILES(VECTOR(VECTOR),RECTANGULAR). Closest Match is %FRACTILES(MATRIX(REAL),VECTOR)
## SX27. Illegal Combination of Data Types for Operation
>>>>s(sims,||.25,.75||)<<<<
Does anybody know how to make them match?

Thank you,

C
TomDoan
Posts: 7814
Joined: Wed Nov 01, 2006 4:36 pm

Re: QUANTILE

Unread post by TomDoan »

%FRACTILES applies to only one "vector" of data at a time so you have to extract each set of bootstrapped values in turn for each of the coefficients. Do something like this:

Code: Select all

dec rect[vect] fract(%rows(beta1),%cols(beta1))
dec vect onevect(bootdraws)
dec integer k
*
do i=1,%rows(beta1)
   do j=1,%cols(beta1)
      ewise onevect(k)=sims(k)(i,j)
      compute fract(i,j)=%fractiles(onevect,||.25,.75||)
   end do j
end do i
That will give you an N x K set of two vectors with the .25 and .75 percentiles for each coefficient.
comac
Posts: 25
Joined: Mon Jun 29, 2009 7:31 am

Re: QUANTILE

Unread post by comac »

Tom -- this is helpful. However i get the following error message:
## SX11. Identifier K is Not Recognizable. Incorrect Option Field or Parameter Order?
>>>> ewise onevect(k)<<<<
How could I help it?
Thank you,

C.
TomDoan
Posts: 7814
Joined: Wed Nov 01, 2006 4:36 pm

Re: QUANTILE

Unread post by TomDoan »

Just add

Code: Select all

dec integer k
I've fixed the post above.
comac
Posts: 25
Joined: Mon Jun 29, 2009 7:31 am

Re: QUANTILE

Unread post by comac »

Tom -- sorry for bothering.

The code needs 'sims' to be declared itself. I added to your code. The program does not crash but in the output below there is obviously something wrong.

Code: Select all

dec rect[vect] fract(%rows(beta1),%cols(beta1))
dec vect onevect(bootdraws)
dec integer k
dec vect[rect] sims(bootdraws)
*
compute sims(draw) = betauip(draw)
do i=1,%rows(beta1)
   do j=1,%cols(beta1)
      ewise onevect(k)=sims(k)(i,j)
      compute fract(i,j)=%fractiles(onevect,||.25,.75||)
   end do j
end do i

-0.63567 -0.22892 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
To simplify things, I would be happy if I could get quantiles of the whole distribution (and not coefficient by coefficient). Is there some way? Are the two coefficients overthere those for the whole distribution of beta1?

Thank you again.
TomDoan
Posts: 7814
Joined: Wed Nov 01, 2006 4:36 pm

Re: QUANTILE

Unread post by TomDoan »

Since sims was supposed to be the source for the simulations, the fact that it isn't defined would be a major problem in computing the percentiles of the simulations. Your loop should actually read:

Code: Select all

  compute beta1(draw) = [....instructions.....]
  compute beta2(draw) = [....instructions.....]
I assumed because of the way you wrote it that beta1 and beta2 were representatives of what you wanted to save, rather than the actual storage of the bootstrap draws. (It's usually better to include the complete set of instructions rather than trying to paraphrase).

So where I said sims, you actually want beta1 (and beta2 in a separate loop) and where I said %rows(beta1) and %cols(beta1) you want the rows and columns of whatever you were saving.
comac
Posts: 25
Joined: Mon Jun 29, 2009 7:31 am

Re: QUANTILE

Unread post by comac »

Tom -- thank you! Still, I am a bit confused.

I am saving beta1 as I want a distribution for that, and consequently fractiles for its distribtuion.

Following your hint I've substituted 'sims' with 'beta1' in the inside-loop.

Code: Select all

compute rstart=%regstart()
compute rend  =%regend()
*
compute bootdraws=100
compute nvar  =5
compute nsteps=8
dec vect[rect] beta1(bootdraws)
dec rect[vect] fract(%rows(beta1),%cols(beta1))
dec vect onevect(bootdraws)
dec integer k
*
infobox(action=define,progress,lower=1,upper=bootdraws) $
   "Bootstrap Simulations"
do draw=1,bootdraws
   @VARBootDraw(model=varmodel,resids=resids) rstart rend
   *
   * Estimate the model with resampled data
   *
   estimate(noprint,noftests) rstart rend
  [...instructions.....]	*
	compute beta1(draw) = [....instructions.....]
   do i=1,%rows(beta1)
   do j=1,%cols(beta1)
   ewise onevect(k)=beta1(k)(i,j)
      compute fract(i,j)=%fractiles(onevect,||.025,.975||)
   end do j
 end do i
 *
 infobox(current=draw)
end do draw
infobox(action=remove)

dis fract

The results are just fine for fractile(1,1).
The problem is that (as before) the quantiles other than the one in (1,1) are not defined. As the code is writte, I guess those in (1,1) are quantiles for the whole distribution of beta1.Isn't it?
-1.61601 1.41303 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Thank you for your patience,
C.
TomDoan
Posts: 7814
Joined: Wed Nov 01, 2006 4:36 pm

Re: QUANTILE

Unread post by TomDoan »

You have to move the calculation of the quantiles outside the loop. So the loop should look like:

Code: Select all

infobox(action=define,progress,lower=1,upper=bootdraws) $
   "Bootstrap Simulations"
do draw=1,bootdraws
   @VARBootDraw(model=varmodel,resids=resids) rstart rend
   *
   * Estimate the model with resampled data
   *
   estimate(noprint,noftests) rstart rend
  [...instructions.....]   *
   compute beta1(draw) = [....instructions.....]
*
infobox(current=draw)
end do draw
infobox(action=remove)
The dimensions of FRACT need to be the dimensions of what you're saving in beta1, not beta1 itself. (beta1 is the storage for the set of draws). I'm guessing that the columns are nvar and I'll call the rows # of regressors. So the post-loop processing is:

Code: Select all

dec rect[vect] fract(# of regressors,nvar)
dec vect onevect(bootdraws)
dec integer k

do i=1,# of regressors
   do j=1,nvar
   ewise onevect(k)=beta1(k)(i,j)
      compute fract(i,j)=%fractiles(onevect,||.025,.975||)
   end do j
end do i
dis fract
comac
Posts: 25
Joined: Mon Jun 29, 2009 7:31 am

Re: QUANTILE

Unread post by comac »

I am sorry. Probably I was completely unclear about it.

Beta1 is computed as a scalar and beta1 in the loop collects them all.

Hence, I am setting fract(1,1), right?

If it is so, the code works just perfectly. Many thanks.

Code: Select all

dec rect[vect] fract(1,1)
dec vect onevect(bootdraws)
dec integer k
do i=1,1
   do j=1,1
   ewise onevect(k)=beta1(k)(i,j)
      compute fract(i,j)=%fractiles(onevect,||.025,.975||)
   end do j
 end do i

dis fract
TomDoan
Posts: 7814
Joined: Wed Nov 01, 2006 4:36 pm

Re: QUANTILE

Unread post by TomDoan »

If you're collecting a scalar, then that would be correct.
Post Reply