2016-05-08 6 views
0

Ich habe eine Datenbank mit einer Anzahl von Menschen, die mehrere Abonnements für einen Dienst auf einmal und Transaktionsdaten für jedes Ereignis während der Laufzeit des Abonnements haben können. Ich versuche, eine Variable zu erstellen, die die Anzahl der aktuellen aktiven Abonnements zählt, die der Benutzer zu einer bestimmten Transaktionszeit hat.Graf gleichzeitige Abonnements

ein Beispiel zu veranschaulichen, leben meine Daten in der Form:

person | subscription | obs_date | sub_start_date | sub_end_date | num_concurrent_subs 
-------------------------------------------------------------------------------------- 
1  | 1   | 09/01/10 | 09/01/10  | 09/01/11  | 1 
1  | 1   | 10/01/10 | 09/01/10  | 09/01/11  | 2 
1  | 1   | 11/01/10 | 09/01/10  | 09/01/11  | 2 
1  | 2   | 10/01/10 | 10/01/10  | 09/01/11  | 2 
1  | 2   | 11/01/10 | 10/01/10  | 09/01/11  | 2 
1  | 3   | 11/01/14 | 09/01/14  | .   | 1 
1  | 3   | 11/01/16 | 09/01/14  | .   | 1 
1  | 4   | 11/01/15 | 10/01/15  | 11/01/15  | 3 
1  | 5   | 11/01/15 | 10/01/15  | 11/01/15  | 3 

Und so weiter und für jede Person so weiter. Ich möchte die num_concurrent_subs wie oben generieren.

Das heißt, für jede Person, betrachten Sie jede Beobachtung und finden Sie, wie viele Abonnements es in den Bereich sub_start_date bis sub_end_date fällt.

Ich habe ein wenig über Stata count Funktion gelesen und glaube, ich bin in der Nähe einer Lösung, aber ich bin mir nicht sicher, wie man es über verschiedene Abonnements zu überprüfen.

+0

Streng 'count' ist ein Befehl, keine Funktion. In Stata sind Befehle und Funktionen verschiedene Arten von Bestien. –

Antwort

1

Sie können dies tun, indem Sie die Subskriptionsinformationen von den Transaktionsdaten trennen und die Subskriptionsdaten in eine lange Form umwandeln, mit einer Beobachtung für das Startdatum und einer weiteren für das Enddatum. Dann rekombinieren Sie mit den Transaktionsdaten und sortieren nach einer einzigen Datumsvariablen. Sie verwenden eine Variable onoff, um den Anfang und das Ende jedes Abonnements zu verfolgen. Etwas wie:

* Example generated by -dataex-. To install: ssc install dataex 
clear 
input byte(person subscription) str8(obs_date sub_start_date sub_end_date) byte num_concurrent_subs 
1 1 "09/01/10" "09/01/10" "09/01/11" 1 
1 1 "10/01/10" "09/01/10" "09/01/11" 2 
1 1 "11/01/10" "09/01/10" "09/01/11" 2 
1 2 "10/01/10" "10/01/10" "09/01/11" 2 
1 2 "11/01/10" "10/01/10" "09/01/11" 2 
1 3 "11/01/14" "09/01/14" "."  1 
1 3 "11/01/16" "09/01/14" "."  1 
1 4 "11/01/15" "10/01/15" "11/01/15" 3 
1 5 "11/01/15" "10/01/15" "11/01/15" 3 
end 

* should always have an observation identifier 
gen obsid = _n 

* convert string to Stata numeric dates 
gen odate = daily(obs_date,"MD20Y") 
gen substart = daily(sub_start_date,"MD20Y") 
gen subend = daily(sub_end_date,"MD20Y") 
format %td odate substart subend 
save "main_data.dta", replace 

* reduce to subscription info with one obs for the start and one obs 
* for the end of each subscription. use an onoff variable to tract 
* start and end events 
keep person subscription substart subend 
bysort person subscription substart subend: keep if _n == 1 
expand 2 
bysort person subscription: gen adate = cond(_n == 1, substart, subend) 
by person subscription: gen onoff = cond(_n == 1, 1, -1) 
replace onoff = 0 if mi(adate) 
format %td adate 

append using "main_data.dta" 

* include obs date in adate and nothing happens on the observation date 
replace adate = odate if !mi(obsid) 
replace onoff = 0 if !mi(obsid) 

* order by person adate, put on event first, then obs events, then off events 
gsort person adate -onoff 
by person: gen concur = sum(onoff) 

* return to original obs 
keep if !mi(obsid) 
sort obsid 
+0

Diskussion über den 'expand 2' Trick unter http://www.stata-journal.com/sjpdf.html?articlenum=dm0068 –

1

Hier ist eine andere Möglichkeit, dies mit rangejoin zu tun (von SSC). Um es zu installieren, geben Sie in Stata das Befehlsfenster:

ssc install rangejoin 

Mit rangejoin, können Sie jedes Abonnement mit allen Transaktionsdaten paaren, die innerhalb des Abonnements Start- und Enddatum fällt. Dann ist es nur eine Frage des Zählens, pro Transaktionsbeobachtung, wie viele Abonnements es gepaart ist.

* Example generated by -dataex-. To install: ssc install dataex 
clear 
input byte(person subscription) str8(obs_date sub_start_date sub_end_date) byte num_concurrent_subs 
1 1 "09/01/10" "09/01/10" "09/01/11" 1 
1 1 "10/01/10" "09/01/10" "09/01/11" 2 
1 1 "11/01/10" "09/01/10" "09/01/11" 2 
1 2 "10/01/10" "10/01/10" "09/01/11" 2 
1 2 "11/01/10" "10/01/10" "09/01/11" 2 
1 3 "11/01/14" "09/01/14" "."  1 
1 3 "11/01/16" "09/01/14" "."  1 
1 4 "11/01/15" "10/01/15" "11/01/15" 3 
1 5 "11/01/15" "10/01/15" "11/01/15" 3 
end 

* should always have an observation identifier 
gen obsid = _n 

* convert string to Stata numeric dates 
gen odate = daily(obs_date,"MD20Y") 
gen substart = daily(sub_start_date,"MD20Y") 
gen subend = daily(sub_end_date,"MD20Y") 
format %td odate substart subend 
save "main_data.dta", replace 

* reduce to subscription start and end date per person 
bysort person subscription substart subend: keep if _n == 1 
keep person substart subend 

* missing values will exclude obs so use a date in the future 
replace subend = mdy(1,1,2099) if mi(subend) 

* pair each subscription with an obs date 
rangejoin odate substart subend using "main_data.dta", by(person) 

* the number of current subcription is the number of pairings 
bysort obsid: gen current = _N 

* return to original obs 
by obsid: keep if _n == 1 
sort obsid 
drop substart subend 
rename (substart_U subend_U) (substart subend)