Thank u Jack for this nice solution!

Leon

Am 25.02.2013 um 01:20 schrieb "Riccardo (Jack) Lucchetti" 
<r.lucchetti(a)univpm.it>:

> On Sun, 24 Feb 2013, Pindar wrote:
> 
>> Hi,
>> 
>> I'd like to point out, that a 'good' 'aggregate by' function would do such a 
>> job as described below.
>> Unfortunately I'm stuck with more then bivariate interaction but I'm sure 
>> GRETL can do this,
>> this question is how!
> 
> The script below should do what I think you need; the trick is creating a 
> series which contains, in coded form, all the possible combinations of values 
> of the variables contained in a list. This is what the function "pack" does; 
> note that "pack" also creates a matrix which is used in the "unpack" function 
> later.
> 
> See if this helps:
> 
> <hansl>
> set echo off
> set messages off
> 
> function series pack(list X, matrix *pwrof2)
>    /*
>    a check should be necessary that all series in X
>    are discrete; for the moment, let's just skip it
>    */
> 
>    series ret = 0
>    pwrtot = 1
>    k = nelem(X)
>    # first build the nvalues vector
>    pwrof2 = {}
>    n = 1
>    k = 1
>    loop foreach i X --quiet
>        ret += k*X.$i
>        n = 2^ceil(log2(1+max(X.$i)))
>        k *= n
>        pwrof2 |= n
>    end loop
> 
>    return ret
> end function
> 
> function matrix unpack(scalar x, matrix pwr)
> 
>    k = rows(pwr)
>    matrix ret = zeros(k,1)
> 
>    loop i=1..k --quiet
>        h = pwr[i]
>        a = x % h
>        ret[i] = a
>        x = (x-a)/h
>    end loop
> 
>    return ret
> end function
> 
> # --- END FUNCTIONS -----------------------------------------
> 
> open pizza4.gdt
> series ages = age<=20 ? 0 : (age>20 && age <=40) ? 1 : 2
> 
> list A = female hs ages
> matrix codes = {}
> u = pack(A, &codes)
> 
> n_u = values(u)
> loop i = 1..rows(n_u) --quiet
>    k = n_u[i]
>    smpl u==k --restrict --replace
>    c = unpack(k, codes)
>    l = 1
>    loop foreach j A --quiet
>        printf "%10s = %d", "$j", c[l]
>        l++
>    end loop
> 
>    printf "\ncases = %d, mean(pizza) = %g, mean(income) = %g\n\n", \
>      $nobs, mean(pizza), mean(income)
> end loop
> 
> smpl full
> </hansl>
> 
> 
> 
>> 
>> It's even more complex since the R function is not that good either, cos 
>> e.g. for MAVOVA one needs the variance-covariance-structure of
>> the 'interaction series'. That's why in GRETL lists should be processed 
>> which makes the stuff not easier.
>> 
>> I worked around with the new '^' operator and have some promising results, 
>> but a build-in function would be the best.
>> 
>> Cheers
>> Leon
>> 
>> <hansl>
>> open pizza4.gdt
>> series ages = age<=20 ? 0 : (age>20 && age <=40) ? 1 : 2
>> set echo off
>> foreign language=R --send-data --quiet
>>   library(plyr)
>>   ddply(gretldata[,c(1,2,4,6,8)], ~ female + college + ages, 
>> numcolwise(mean))
>> end foreign
>> <hansl>
>> 
>> While the bivariate case in rather easy as in
>> 
>> <hansl>
>> open pizza4.gdt
>> set echo off
>> series ages = age<=20 ? 0 : (age>20 && age <=40) ? 1 : 2
>> 
>> list G1 = 2 4
>> list G2 = 2 8
>> list G3 = 4 8
>> list G = G1 || G2
>> 
>> scalar times = 2                                    # should also be 
>> possible to be set to nelem(G)
>> 
>> #set up of all combination list
>> loop for i=2..times -q
>>    string listName = "inter$i"
>>    list @listName = null
>> endloop
>> 
>> list part1 = null
>> list part2 = G
>> 
>> # bivariate interaction
>> loop foreach i G-q
>>        part1 = G.$i
>>        part2 -= G.$i
>>        inter2 += part2^part1
>>        part2 += G.$i
>> endloop
>> <hansl>
>> 
>> 
>> 
>> Am 20.02.2013 17:45, schrieb Riccardo (Jack) Lucchetti:
>>> On Wed, 20 Feb 2013, Allin Cottrell wrote:
>>>> On Wed, 20 Feb 2013, Riccardo (Jack) Lucchetti wrote:
>>>>> Very nice. The next step, logically, would be to support user-written 
>>>>> functions too. However, this would mean to complicate the code by a 
>>>>> factor (I reckon) of 1 to 5 or so.
>>>> I was afraid the factor might be at the top end of that range, but I 
>>>> experimented and it's more like 0.25. So user-functions are now supported. 
>>>> The function must take a single series argument and return a scalar. 
>>>> Example:
>>>> <hansl>
>>>> function scalar my_aggregator (series x)
>>>> return sum(x^3)
>>>> end function
>>>> open credscore.gdt
>>>> matrix m = aggregate(Income, Acc, my_aggregator)
>>>> print m
>>>> </hansl>
>>> Now, I don't want to be guilty of personality cult, but at the risk of 
>>> sounding like an old Stalinist apparatchik I have to say I am left in awe 
>>> by the skills of our beloved leader.
>>> Studying the cvs diff has been for several years my primary method for 
>>> learning C, but this case stands out as a true gem.
>>> Thank you.
>>> -------------------------------------------------------
>>>  Riccardo (Jack) Lucchetti
>>>  Dipartimento di Scienze Economiche e Sociali (DiSES)
>>> 
>>>  Università Politecnica delle Marche
>>>  (formerly known as Università di Ancona)
>>> 
>>>  r.lucchetti(a)univpm.it
>>>  http://www2.econ.univpm.it/servizi/hpp/lucchetti
>>> -------------------------------------------------------
>>> _______________________________________________
>>> Gretl-users mailing list
>>> Gretl-users(a)lists.wfu.edu
>>> http://lists.wfu.edu/mailman/listinfo/gretl-users
> 
> -------------------------------------------------------
>  Riccardo (Jack) Lucchetti
>  Dipartimento di Scienze Economiche e Sociali (DiSES)
> 
>  Università Politecnica delle Marche
>  (formerly known as Università di Ancona)
> 
>  r.lucchetti(a)univpm.it
>  http://www2.econ.univpm.it/servizi/hpp/lucchetti
> -------------------------------------------------------

Reply via email to