LesezeichenAbonnierenRSS-Feed abonnieren
AnjaV
Calcite | Level 5

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

5 ANTWORTEN 5
mfab
Quartz | Level 8

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

AnjaV
Calcite | Level 5

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

WolfgangHornung
Fluorite | Level 6

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

mfab
Quartz | Level 8

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

AnjaV
Calcite | Level 5

Hallo Wolfgang, Hallo Michael,

 

vielen vielen Dank für eur Hilfe!!!

 

Beste Grüße

Anja

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

Diskussionsstatistiken
  • 5 Antworten
  • 1503 Aufrufe
  • 0 Kudos
  • 3 in Unterhaltung