Lösung_4

Werbung
/* Übung zur SAS-Vertiefung */
/* Vorbereitung */
/* Pfad zu Projektordner anlegen */
%LET path_project = G:\SAS-Kurs SS2011\Übung;
/* Pfade zum Daten- und Ergebnisse-Ordner anlegen */
%LET path_data = &path_project.\Daten;
%LET path_results = &path_project.\Ergebnisse;
/* Ordner als SAS-Bibliotheken verfügbar machen */
/* Bibliothek namens "data" anlegen, die auf den Ordner mit den Daten verweist
*/
LIBNAME data "&path_data.";
LIBNAME library "&path_data.";
/* Bibliothek namens "results" anlegen, die auf den Ergebnis-Ordner verweist
*/
LIBNAME results "&path_results.";
/*****************************************************************************
***********************/
/* Block 4: Makros und PROC SQL */
/**************************************************/
/* Makro, dass Zahlen von Minimum bis Maximum im Log-File ausgibt */
%MACRO count (min= , max= );
%DO i=&min. %TO &max.;
/* Schleifenanfang; %-Zeichen nicht vergessen,
max ist innerhalb des Makros eine Makrovariablen ->
&max. statt max */
%PUT &i.;
/* mache irgendetwas mit der Zählvariable i -> hier
Ausgabe im log-Fenster */
%END;
/* Schleifenende; %-Zeichen nicht vergessen */
%MEND count;
/* Makroaufruf */
%count (min=5 , max=9 );
/**************************************************/
/* Makro, dass beliebig viele Namen im Log-File ausgibt */
/* Vorarbeit: Makro Words aus der Vorlesung laufen lassen */
%MACRO WORDS(STRING);
%LOCAL COUNT WORD;
%LET COUNT=1 ;
%LET WORD=%QSCAN(&STRING,&COUNT,%STR( ));
%DO %WHILE(&WORD NE) ;
%LET COUNT=%EVAL(&COUNT+1);
%LET WORD=%QSCAN(&STRING,&COUNT,%STR( ));
%END;
%EVAL(&COUNT-1)
%MEND WORDS;
1
%MACRO names (namen= );
%LET anzahl_namen = %WORDS(&namen.);
%DO i=1 %TO &anzahl_namen.;
/* Schleifenanfang; %-Zeichen nicht vergessen,
anzahl_namen ist innerhalb des Makros eine
Makrovariablen
%PUT %SCAN(&namen., &i.);
-> &anzahl_namen. statt anzahl_namen */
/* Ausgabe des i-ten Namens im Log-Fenster */
%END;
%MEND names;
/* Makroaufruf */
%names (namen = Lisa Johannes Sabine Maria Paul);
/**************************************************/
/* Makro zu Maßzahlen (PROC MEANS)
Schreiben Sie ein Makro.
Dieses soll zu einer Menge von metrischen Variablen (übergeben als
Variablenliste)
den Variablennamen, die (gültige) Fallzahl,
Minimum, unteres Quartil, Median, oberes Quartil und Maximum ausgeben.
Der Name des Input-Datensatzes soll als Makro-Variable übergeben werden.
Der Name des Output-Datensatzes soll als Makro-Variable übergeben werden.
Die Liste mit den Namen der metrischen Variablen soll als Makro-Variable
übergeben werden.
*/
/* Hilfsvariablen zum Schreiben des Makros */
%LET input_dataset = data.nhanes_smokers;
%LET output_dataset = table_smokers;
%LET variable_list = age age_started_smoking;
*%LET i=1;
%MACRO tabelle (input_dataset = , output_dataset = , variable_list = );
/* Zähle die Anzahl an Variablen in der übergebenen Variablenliste */
%LET M=%WORDS(&variable_list.);
/* das Makro %WORDS von
weiter oben muss bekannt sein */
%PUT Die Anzahl an Variablen beträgt &M.;
/* Durchlaufe alle Variablen */
%DO i=1 %TO &M.;
/* Beginn der Schleife von 1 bis M */
%LET var = %SCAN (&variable_list., &i.);
/* definiere die aktuelle Variable */
%PUT Iterationsnummer = &i. und Variable = &var.;
/* Kontrollausgabe im Log-Fenster */
2
/* Fallzahl und weitere Maßzahlen berechnen und ausgeben */
ODS OUTPUT Summary=output1 (RENAME=(&var._N = N
&var._MIN = MIN
&var._Q1 = Q1
&var._MEDIAN = MEDIAN
&var._Q3 = Q3
&var._MAX = MAX) );
PROC MEANS DATA = &input_dataset. N MIN Q1 MEDIAN Q3 MAX ;
VAR &var.;
RUN;
ODS OUTPUT CLOSE;
/* neue Variable Variablenname einfügen */
DATA output1_1;
SET output1;
FORMAT Variablenname $25.; /* das hier muss man wissen */
Variablenname = "&var.";
/* hier doppelte Anführungszeichen um die Makro-Variable! */
RUN;
/* Output verschönern */
DATA output3_3;
RETAIN Variablenname N MIN Q1 MEDIAN Q3 MAX;
/* interessierende Variablen sortieren (RETAIN muss vor SET stehen!) */
SET output1_1;
RUN;
/* Output für alle Variablen zusammenfügen */
%IF &i.=1 %THEN %DO;
/* im ersten Schleifendurchlauf Output zuweisen */
DATA &output_dataset.;
SET output3_3;
RUN;
%END;
%IF &i.>1 %THEN %DO;
/* in allen weiteren Schleifendurchläufen Output um eine weitere Zeile
ergänzen */
DATA &output_dataset.;
SET &output_dataset. output3_3;
RUN;
%END;
%END;
/* Ende der Schleife von 1 bis M */
%MEND tabelle;
3
/* Makroaufruf */
%tabelle(input_dataset = data.nhanes_smokers,
output_dataset = table_smokers,
variable_list = age age_started_smoking age_last_smoked
number_smoked_per_day number_smoked_when_quit);
/**************************************************/
/* Makro zu Regression: lineare Regression mit beliebig vielen abhängigen
Variablen
Schreiben Sie ein Makro, dass für eine Liste von abhängigen Variablen
eine Regression mit einer (und immer derselben) Einflussgröße durchführt.
Dem Makro soll
- der Name des Input-Datensatzes
- eine Liste mit abhängigen Variablen
- und eine unabhängige Variable
als Makro-Variablen übergeben werden.
Rufen Sie das Makro auf und übergeben Sie
- den nhanes_smokers-Datensatz als Input-Datensatz,
- number_smoked_per_day und age_started_smoking als abhängige Variablen und
- age als unabhängige Variable.
*/
/* Zur Entwicklung des Makros */
%LET data=data.nhanes_smokers;
%LET all_dependent=number_smoked_per_day age_started_smoking;
%LET independent=age;
/* Lösung mit %DO %WHILE */
%macro myreg(data, all_dependent, independent);
%let k=1;
/* initialisiere k mit 1*/
%let dependent=%scan(&all_dependent., &k);
/* setze dependent auf den
ersten Wert in all_dependent */
%do %while(&dependent NE);
/* tue, solange abh nicht leer */
proc reg data=&data.;
model &dependent.= &independent. ;
quit;
möglich */
/* schätze das Regressionsmodell */
/* Alternativ zu "quit;" auch "RUN;"
%let k=%eval(&k+1);
/* erhöhe k um 1 */
%let dependent= %scan(&all_dependent, &k);
/* setze abh auf den k-ten
Wert in all_abh */
%end;
%mend myreg;
%myreg(data=data.nhanes_smokers, all_dependent=number_smoked_per_day
age_started_smoking, independent=age);
/* oder auch alternativ: Lösung mit %DO %TO */
4
%macro myreg2(data, all_dependent, independent);
/* Zähle die Anzahl an Variablen in der übergebenen Variablenliste */
%LET M=%WORDS(&all_dependent.);
/* das Makro %WORDS von
weiter oben muss bekannt sein */
%PUT Die Anzahl an Variablen beträgt &M.;
/* Durchlaufe alle Variablen */
%DO i=1 %TO &M.;
1 bis M */
/* Beginn der Schleife von
%LET dependent = %SCAN (&all_dependent., &i.);
aktuelle Variable */
%PUT Iterationsnummer = &i. und Variable = &dependent.;
im Log-Fenster */
proc reg data=&data.;
model &dependent.= &independent. ;
quit;
möglich */
/* definiere die
/* Kontrollausgabe
/* schätze das Regressionsmodell */
/* Alternativ zu "quit;" auch "RUN;"
%end;
%mend myreg2;
%myreg2(data=data.nhanes_smokers, all_dependent=number_smoked_per_day
age_started_smoking, independent=age);
5
Herunterladen