The Projrotate routine kept one extra row and column . the following will
return the same results.
Therefore
rotate =. 0 [ oblique =.1
ts 'rotate test 55'
0.195789 9.71479e7
ts 'oblique test 55'
0.844889 6.29288e7
(rotate test 55) -: oblique test 55
1
test=: 3 : 0
NB. x: 0 for projection, 1 for rotation
NB. y: number of age and service
:
POP=:((>:/)~i.y)*"2 (1000*i.2)+/(100*i.y)+/1+i.y NB. SERVICE AGE
QR=: ((>:/)~i.y)*"2 (0.0001* (1000*i.2)+/(100*i.-y)+/1+i.-y) NB. SERVICE
AGE
NV=: (2, y+4,0) $,10000+(100*i.y+4)+/i.y NB. ANS AGE
projrotate`[email protected] POP;NV;QR
)
ProjRotate=: 3 : 0
NB. Population projection using rotation
NB. result by sex year age service will allow us to determine the probable
aging of our population.
NB. pop: number of active employees by sex(2), age(55=16 to 70), service(55
= 0 to 54)
NB. new: number of new employees by sex(2), year of employment(50=years of
projection), age(55)
NB. srv: probability of survival (not dying,quitting or retiring) by
sex(2),age(55),service(55)
'pop new srv'=.y
p=. pop,"2 3 (new,"1 (0)),"0 1"1 2 (0,"2 srv) NB. setup a matrix :
sex,year of projection, age,service
'a n'=. (1 0)+ 1}.$new
r=. (,.)~i.a NB. to shift each slice to the left and to the top
by 1 for each year of projection
t=.-(0,0,a,a)+$p NB. to make space for our rotation
f=.2,a,1+n,n NB. to return to the original size
}:"2}:"1(-f){.(-r)|.!.0"1 2"2 3 */\"3 r |.!.1"1 2"2 3 t{.!.1 p
)
ProjOblique=: 3 : 0
'pop new srv'=.y
p=. pop,"2 3 (new,"1 (0)),"0 1"1 2 (0,"2 srv)
'a n'=. (1 0)+ 1}.$new
r=. |."1|."2*//./.\"3|."2|."1 p NB. this is the 3d oblique
cumulative product, by year of projection
b=. (1+i.a)|."0 1 ((a,n)#0 1) NB. eliminate the unused rows of
the oblique
s=.|:n-(i.n)<./i.a NB. a rotation will position the
required results
n{."1 s|."0 1 " 2 3 b#"1 2"2 3 r NB. we retain the correct number of
columns
)
On Fri, Mar 20, 2009 at 4:01 PM, Devon McCormick <[email protected]> wrote:
> Robert -
>
> Just an initial test:
>
> ts 'oblique test 55'
> |domain error: ProjRotate
> | projrotate`[email protected] POP;NV;QR
>
> Maybe it should be
> oblique=. 1
> ?
>
> Also, unless you move the data initialization out of "test", you cannot
> compare results. So maybe you want to re-structure it to be something
> like:
>
> initData=: 3 : 0
> POP=:((>:/)~i.y)*"2 (1000*i.2)+/(100*i.y)+/1+i.y NB.
> SERVICE
> AGE(?)
> NV=: (2, y+4,0) $,10000+(100*i.y+4)+/i.y NB. ANS
> AGE
> QR=: ((>:/)~i.y)*"2 (0.0001* (1000*i.2)+/(100*i.-y)+/1+i.-y) NB. SERVICE
> AGE
> POP;NV;QR
> )
>
> test=: 4 : 0
> NB. x: 0 for projection, 1 for rotation
> NB. y: service age, ans age, service age(?)
> projrotate`[email protected] (y)
> )
>
> But even though my timings agree with what you showed:
>
> dat=. initData 55
> ts '0 test dat'
> 0.16161181 97135616
> ts '1 test dat'
> 0.65609685 62921152
>
> The results are not the same:
>
> (0 test dat)-:1 test dat
> 0
>
> Regards,
>
> Devon
>
> On Fri, Mar 20, 2009 at 1:51 PM, Robert Cyr <[email protected]> wrote:
>
> > Oblique results can be achieved by using rotate. The performance is quite
> > different. In a test example,
> > if
> > rotate =. 0 [ oblique =. 0 1
> > then
> > ts 'rotate test 55'
> > 0.194581 9.71479e7
> >
> > ts 'oblique test 55'
> > 0.870818 6.29288e7
> >
> > For example, one can project the population of a given population by sex
> > age
> > and service. The estimation of the aging of a particular population and
> > its
> > consequences can then be estimated. The technique requires
> multiplication
> > along a 3d diagonal.
> >
> > test=: 3 : 0
> > NB. x: 0 for projection, 1 for rotation
> > NB. y: number of age and service
> > :
> > POP=:((>:/)~i.y)*"2 (1000*i.2)+/(100*i.y)+/1+i.y NB. SERVICE AGE
> > QR=: ((>:/)~i.y)*"2 (0.0001* (1000*i.2)+/(100*i.-y)+/1+i.-y) NB.
> SERVICE
> > AGE
> > NV=: (2, y+4,0) $,10000+(100*i.y+4)+/i.y NB. ANS AGE
> > projrotate`[email protected] POP;NV;QR
> > )
> >
> > ProjRotate=: 3 : 0
> > NB. Population projection using rotation
> > NB. result by sex year age service will allow us to determine the
> probable
> > aging of our population.
> > NB. pop: number of active employees by sex(2), age(55=16 to 70),
> service(55
> > = 0 to 54)
> > NB. new: number of new employees by sex(2), year of employment(50=years
> of
> > projection), age(55)
> > NB. srv: probability of survival (not dying,quitting or retiring) by
> > sex(2),age(55),service(55)
> > 'pop new srv'=.y
> > p=. pop,"2 3 (new,"1 (0)),"0 1"1 2 (0,"2 srv) NB. setup a matrix :
> > sex,year of projection, age,service
> > 'a n'=. (1 0)+ 1}.$new
> > r=. (,.)~i.a NB. to shift each slice to the left and to the
> top
> > by 1 for each year of projection
> > t=.-(0,0,a,a)+$p NB. to make space for our rotation
> > f=.2,a,1+n,n NB. to return to the original size
> > (-f){.(-r)|.!.0"1 2"2 3 */\"3 r |.!.1"1 2"2 3 t{.!.1 p
> > )
> >
> > ProjOblique=: 3 : 0
> > 'pop new srv'=.y
> > p=. pop,"2 3 (new,"1 (0)),"0 1"1 2 (0,"2 srv)
> > 'a n'=. (1 0)+ 1}.$new
> > r=. |."1|."2*//./.\"3|."2|."1 p NB. this is the 3d oblique
> > cumulative product, by year of projection
> > b=. (1+i.a)|."0 1 ((a,n)#0 1) NB. eliminate the unused rows of
> > the oblique
> > s=.|:n-(i.n)<./i.a NB. a rotation will position the
> > required results
> > n{."1 s|."0 1 " 2 3 b#"1 2"2 3 r NB. we retain the correct number
> of
> > columns
> > )
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
> >
>
>
>
> --
> Devon McCormick, CFA
> ^me^ at acm.
> org is my
> preferred e-mail
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm