Bookmark and Share

Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: st: Doing something an observation-specific number of times

From   Maarten Buis <>
Subject   Re: st: Doing something an observation-specific number of times
Date   Tue, 28 Aug 2012 19:39:29 +0200

On Tue, Aug 28, 2012 at 6:45 PM, robert hartman wrote:
> Imagine that observation 1 has v1 and v2 values of .41 and 78,
> respectively.  <snip>  For example, for observation 1, the new obs 1 v3
> value=((1+(.41^1))/2) + ((1+(.41^2))/2) ...((1+(.41^77))/2) +
> ((1+(.41^78))/2).
> I have begun to think of some klugy ways of doing this via looping or
> even the expand command.

Depending on the number of observations in your original dataset the
-expand- route may be the easiest. If the number of observations is
large than this strategy may be infeasible due to memory limitations.
When it comes to efficiency, you need to make the tradeoff between the
amount of time you need to write the more fancy code (and the effort
you will need to understand it again after some time...) against the
time you safe because it runs quicker. Often the balance will be
against the more fancy solutions(*).

*---------------- begin example ---------------
// create some example data
input v1 v2
.41 78
.23 50

// we need to keep track on who is who before
// expanding
gen id = _n

// create v2 rows per observation
expand v2

// create the appropriate exponent
bys id : gen expo = _n

// create the basic component of the computation
gen double value = (1+v1^expo)/2

// sum() returns a running sum
by id : replace value = sum(value)

// the final sum is the last of the running sum
bys id (expo) : replace value = value[_N]

//get rid of things that are no longer needed
drop expo
by id : keep if _n == 1
drop id

// see the result
*----------------- end example ----------------
(For more on examples I sent to the Statalist see: )

Hope this helps,

(*) This of course ignores the pure joy you will get from figuring out
the fancy solution, but we are not payed to enjoy ourselves!

Maarten L. Buis
Reichpietschufer 50
10785 Berlin
*   For searches and help try:

© Copyright 1996–2018 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index