Hallo Liebe SAS Community,
ich bin auf einen einfachen Ansatz bei Keintz (2012) gestoßen, der es ermöglicht rollierende Datenfenster zu generieren.
DATA rwin / view=rwin;
ws = 90;
nwin = nrecs - ws +1;
do w=1 to nwin;
do p=w to w + ws -1;
set myseries point=p nobs=nrecs;
output;
end;
end;
stop;
run;
Allerding ist es bei dem Code lediglich möglich eine exakte Anzhal (in diesem Fall 90) Beobachtungen pro Fenster zu inkludieren.
Gibt es eine Möglichkeit die Anzhal der Beobachtungen pro Fenster variable zu gestalten.
Mein Datensatz (sehr vereifnacht) besteht aus ca. 500.000 Beobachtungen. Jede BEobachtungen beinhaltet Informationen über das Jahr, die Firmen-ID und weitere Accounting Information: siehe unten
Beob. | Year | FirmID | Earnings | LaggedEarnings |
---|---|---|---|---|
1 | 1970 | 1 | 100 | 0 |
2 | 1971 | 1 | 200 | 100 |
3 | 1972 | 1 | 200 | 200 |
4 | 1973 | 1 | 200 | 200 |
5 | 1974 | 1 | 200 | 200 |
6 | 1970 | 2 | 100 | 0 |
7 | 1971 | 2 | 200 | 100 |
8 | 1972 | 2 | 200 | 200 |
9 | 1970 | 3 | 100 | 0 |
10 | 1971 | 3 | 200 | 100 |
11 | 1972 | 3 | 200 | 200 |
12 | 1973 | 3 | 200 | 200 |
13 | 1974 | 3 | 200 | 200 |
Ich würde aus dem Datensatz einen rollierenden Datensatz in der Form erzeugen. Die entscheidenen Variable ist das Jahr. Dabei sollen die Daten nicht (wie hier) in 3-Jahres PAkete sondern in 10-Jahres Pakete zusammengefasst werden.
Beob. | Window | Year | FirmID | Earnings | LaggedEarnings |
---|---|---|---|---|---|
1 | 1 | 1970 | 1 | 100 | 0 |
2 | 1 | 1970 | 2 | 100 | 0 |
3 | 1 | 1970 | 3 | 100 | 0 |
4 | 1 | 1971 | 1 | 200 | 100 |
5 | 1 | 1971 | 2 | 200 | 100 |
6 | 1 | 1971 | 3 | 200 | 100 |
7 | 1 | 1972 | 1 | 200 | 200 |
8 | 1 | 1972 | 2 | 200 | 200 |
9 | 1 | 1972 | 3 | 200 | 200 |
10 | 2 | 1971 | 1 | 200 | 100 |
11 | 2 | 1971 | 2 | 200 | 100 |
12 | 2 | 1971 | 3 | 200 | 100 |
13 | 2 | 1972 | 1 | 200 | 200 |
14 | 2 | 1972 | 2 | 200 | 200 |
15 | 2 | 1972 | 3 | 200 | 200 |
16 | 2 | 1973 | 1 | 200 | 200 |
17 | 2 | 1973 | 3 | 200 | 2001 |
18 | 3 | 1972 | 1 | 200 | 200 |
19 | 3 | 1972 | 3 | 200 | 200 |
20 | 3 | 1973 | 1 | 200 | 200 |
21 | 3 | 1973 | 3 | 200 | 2001 |
22 | 3 | 1974 | 1 | 200 | 200 |
23 | 3 | 1974 | 3 | 200 | 200 |
Ist dies mit dem obigen Code möglich?
Beste Grüße und vielen Dank
Anja
Hallo Anja,
ich weiß nicht, ob ich die Anfrage richtig verstanden habe.
Geht es um eine Einordnung von Datensätzen in bestimmte Jahres-Zeitfenster (in dem Fall Jahrzente) und eine anschließende Sortierung der Daten?
Dann hätte ich hier folgendes Beispiel, wobei es natürlich weitere und vielleicht auch elegantere Möglichkeiten gibt, das zu lösen:
data have;
input year
firmID
earnings
laggedEarnings;
datalines;
1970 1 100 0
1970 2 150 0
1970 3 100 0
1970 4 200 0
1971 1 100 100
1971 2 150 150
1972 1 150 100
1972 2 100 150
1981 1 100 0
1981 2 150 0
1981 3 200 0
1981 4 150 0
run;
proc sql;
create table want as
select floor(divide(year,10))*10 as window,
*
from have
order by calculated window, year, firmID
;quit;
Beste Grüße
Michael
Hallo Michael,
vielen Dank für deine Hilfe. Entschuldige bitte meine wirre Anfrage.
Ja, und Nein.
Ich würde gerne die Datensätze in Zeitfenster einteilen. Ich würde gerne meinen Datensatz in rollierende Zeitfenster einteilen.
Das Zeitfenster 1970 soll z.B. alle Firmen-Daten von 1961-1970 umfassen. Das Zeitfenster 1971 alle Daten von 1962-1971 usw. Mit der Folge, dass z.B, der Datensatz von 1970 in 10 verschiedenen Zeitfenstern (1970-1979) enthalten ist.
Ziel ist es, dass ich für jedes Zeitfenster eine gepoolte Regression durchführen möchte.Etwa so in der Art.
Proc Rec Data=Want Outest=Regression;
By Zeitfenster;
Run;
Die Lösung ist zwar nicht elegenat, da ich dann viele doppelte Observationen in meinem Datensatz habe aber da ich ein Anfänger bin, weiß ich nicht wie ich sonst eine rollierende gepoolte Regression codieren kann.
Beste Grüße
Anja
Hallo Anja,
vielleicht hilft Dir folgendes als Idee, um die Jahre (hier 1960-1980) Zeitscheiben zuzuordnen:
data jahre;
do jahr=1960 to 1980;
output;
end;
run;
data zeitscheiben(drop=i);
set jahre;
do zeitscheibe= 1960 to 1980;
do i = 0 to 9;
if zeitscheibe<=jahr<=zeitscheibe+i then output;
end;
end;
run;
proc sort data=zeitscheiben nodupkey;
by jahr zeitscheibe;
run;
Viele Grüße
Wolfgang
Hallo Anja,
alles klar, da hatte ich das "rollierend" wohl nicht ganz verstanden.
Wenn ich das richtig sehe, geht es wohl einfach um eine Vervielfältigung der Datensätze mit jeweiliger Einordnung.
Ich habe eine Lösung, ähnlich zu der von Wolfgang:
data have;
input year firmID earnings laggedEarnings;
datalines;
1970 1 100 0
1970 2 150 0
1970 3 100 0
1970 4 200 0
1971 1 100 100
1971 2 150 150
1972 1 150 100
1972 2 100 150
1981 1 100 0
1981 2 150 0
1981 3 200 0
1981 4 150 0
run;
data want2 (drop=n);
set have;
do n = -9 to 0; /* oder n = -9 to 9 je nachdem, was gewünscht ist */
window = year + n;
output;
end;
run;
Eine Sortierung wäre dann noch zu machen, aber grundsätzlich wird jeder Datensatz anhand seines Jahres in die zurückliegenden und kommenden Windows "einsortiert", bzw. dafür vervielfältigt.
Anschließend solltest Du Dein Proc Rec ausführen könnnen. In der Hinsicht kenne ich mich allerdings weniger gut aus.
Um die doppelten Einträge zu vermeiden, kannst Du natürlich auch dynamisch Spalten erzeugen mit einer Kennung, ob ein Satz in ein bestimmtes Intervall fällt. Je nach Anzahl der Intervalle wird das DataSet dann allerdings schnell breit und unperformant. zudem weiß ich nicht, wie sich dann ein Proc Rec ausführen ließe.
Beste Grüße
Michael
Hallo Wolfgang, Hallo Michael,
vielen vielen Dank für eur Hilfe!!!
Beste Grüße
Anja
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!