Am 11.11.2012 06:23, schrieb Allin Cottrell:
On Sat, 10 Nov 2012, Pindar wrote:

I'd be thankful for 'a cheat' in order to improve my code on interaction 
between the factor steps.
I hereby also want to make the proposal of adding a new function to GRETL 
called 'interaction'
that could be used like 'dummify'.  I'm thinking of something like 
interaction(series or list [discrete variables], optional series or list).
If only one argument is given this would be the case of the example below, if 
two arguments are given the case of the user guide is tackled.

Up until now I generated interaction series according to the example on p.121 
in the guide.
Now with factor step combinations it's getting really tricky:
1) make the list of factors         -> ok
2) make dummies for all steps of each factor                -> ok
3) interact the dummies BUT without replications       -> here I have a 
problem

What if there are more than two factors? My 'if condition' is not that good.
I'm using the 'loop foreach' construction.

<hansl>
dummify factors
loop foreach i factors-q
   sprintf ni "%d",i
   list Dum_$i=null
   string str="D$i*"
   list Dum_$i=@str
endloop
[...]

Im not sure I exactly understand what you're aiming for, but if I'm 
guessing right you want something like this (assuming two factor 
series named F1 and F2):

<hansl>
# create lists of dummies for F1, F2 values
list DF1 = dummify(F1, NA)
list DF2 = dummify(F2, NA)

list Interact = null
string vname

# create list of cross-products
loop foreach i DF1 -q
   loop foreach j DF2 -q
     vname = "$i_$j"
     series @vname = $i * $j
     Interact += @vname
   endloop
endloop
</hansl>

Now Interact will hold a list of terms such as DF1_1_DF2_1, 
DF1_1_DF2_2,...,DF1_3_DF2_4.

This should generalize to more than two series without too much 
trouble, though generalizing it to an arbitary number of series, not 
known in advance, would not be trivial.
Yeah, really not trivial. Have a look at that, this could work, or:
<hansl>
list Flist =F1 F2

loop foreach i Flist -q
    sprintf ni "%d",i
    list Dum_@ni=dummify($i, NA)
endloop

list Interact = null
string vname
scalar start2
loop for i=1.. nelem(Flist) -q
    scalar start2=i+1
      loop for j=start2.. nelem(Flist) -q
          loop foreach k Dum_$i -q
              loop foreach q Dum_$j -q
                  vname = "$k_$q"
                  print vname
                  series @vname = $k * $q
                  Interact += @vname
              endloop
          endloop
      endloop
endloop
<hansl>

Allin Cottrell
_______________________________________________
Gretl-users mailing list
Gretl-users@lists.wfu.edu
http://lists.wfu.edu/mailman/listinfo/gretl-users