###################################################### # # # Universität Regensburg - Lehrstuhl für Ökonometrie # # # # Kursprüfung im Fach: Programmieren mit R # # # # Wintersemester 2017/2018 # # # # Datum: 03.11.2017 # # # ###################################################### ###################################################### # Bearbeitungshinweise: ###################################################### # # - Die Bearbeitungszeit beträgt 60 (+5) Minuten (Abspeichern, Versenden) # - Die Klausur besteht aus vier Aufgaben, die alle bearbeitet werden sollen. # - Sie können maximal 75 Punkte erreichen, die Bewertung beginnt allerdings # erst bei 60 Punkten. # Aufgabe 1: 38 Punkte # Aufgabe 2: 20 Punkte # Aufgabe 3: 8 Punkte # Aufgabe 4: 9 Punkte # - Zugelassene Hilfsmittel sind das Kursmaterial (gedruckt oder digital) sowie R-bezogene # Internetseiten (inkl. Foren aller Art). # - Benennen Sie diese Datei zunächst um in: PMR_ws17_kla_Nachname_Vorname.R (IHR Name...!) # - Senden Sie am Ende der Bearbeitungszeit Ihren R-Code an: # christoph.rust@wiwi.uni-regensburg.de # - Drucken Sie nach dem Versenden Ihren Code aus und geben Sie ihn bei der Aufsicht ab. # - Lösen Sie die folgenden Aufgaben mittels ausführbarem Code in R (aktuelle Version) # und ergänzen Sie bei Bedarf Ihre Programmierung um aussagekräftige Kommentare. # - Interpretationen, etc. sollen ebenfalls als Kommentar angegeben werden. # - Falls Teile Ihres Programms nicht funktionieren, geben Sie ebenfalls in Kommentarform # an, wie Ihr Lösungsweg in algorithmischer Form aussehen würde. Auch dann ist eine # volle Punktzahl möglich. ###################################################### # Name: # Vorname: # Matrikelnummer: ###################################################### ###################################################### # # #### #### #### ### # # # #### # # # # ## # # # # # # # # # # ### # #### #### #### ### #### #### #### # # # ###################################################### ###################################################### # Aufgabe 1 (38 Punkte): ###################################################### ## a) (2 Punkte) Laden Sie die Datei "btw.rdata" von der Homepage des ## Lehrstuhls herunter und laden Sie diese Datei in R. ## ## Der hiermit geladene Datensatz "btw" enthält für die sechs Parteien, ## die in den Bundestag eingezogen sind (und einer weiteren kleinen Partei) die ## Wahlergebnisse der Zweitstimmen aus allen Wahlkreisen der Bundestagswahl 2017. ## Neben den Wahlergebnissen sind außerdem weitere Strukturvariablen zu den ## Wahlkreisen enthalten, bspw. Pro-Kopf-Einkommen. ## b) (2 Punkte) Machen Sie sich mit der Struktur des Datensatzes vertraut. ## Wie viele Wahlkreise gibt es? Warum entspricht die Anzahl der ## Beobachtungen nicht der Anzahl der Landkreise? ## c) (5 Punkte) Suchen Sie sich einen Wahlkreis Ihrer Wahl und erzeugen ## Sie für diesen Wahlkreis ein Balkendiagramm für die Anteile der ## Stimmen nach Partei. Schreiben Sie auch den Namen des von Ihnen ## ausgewählten Wahlkreises in den Titel der Grafik. ## ## Hinweis: Speichern Sie den Teildatensatz der nur die Ergebnisse ## zu dem von Ihnen ausgewählten Landkreis enthält z.B. ## in der Variable "btw_wahlkreis" ab und nutzen Sie ## diesen um den Plot zu erzeugen! Damit auch die Parteinamen ## unter den jeweiligen Balken stehen, können Sie entweder einen ## benannten Vektor übergeben oder die Parteinamen explizit über ## das Argument "names.arg" angeben. ## d) (6 Punkte) Wie heißt der Wahlkreis in dem die Partei "DiePartei" ## ihr bestes Wahlergebnis erreicht hat? ## e) (4 Punkte) Zeichnen Sie für den kompletten Datensatz einen ## "AnteilStimmen - ProKopfBIP" - Coplot, bedingen Sie dazu ## auf die Variable Partei. ## ## Hinweis: Damit die einzelnen Scatterplots übersichtlich in einer Zeile ## angezeigt werden, können Sie das Argument "rows=1" setzen. ## f) (2 Punkte) Wie viele gültige Stimmen gab es Bundesweit? ## Speichern Sie das Ergebnis in der Variable "stimmen_insgesamt" ab. ## ## Hinweis: Bedenken Sie, dass jeder Wahlkreis mehrfach im Datensatz ## enthalten ist (für jede Partei genau einmal). ## g) (4 Punkte) Berechnen Sie nun die Stimmanteile der sieben ## Parteien für Deutschland insgesamt. ## ## Hinweis: Sie können dazu die Funktion "tapply" verwenden ## sowie Ihr Ergebnis aus der vorigen Teilaufgabe. ## Alternativ können Sie die Summen der Stimmen für ## die einzelnen Parteien auch jeweils einzeln berechnen ## und anschließend durch das Ergebnis der vorigen ## Teilaufgabe dividieren. ## h) (3 Punkte) Erzeugen Sie eine weitere Variable "ost" in dem ## Datensatz "btw", diese soll die Werte 0 für alle ## westdeutschen Wahlkreise annehmen und 1 für alle ostdeutschen. ## ## Hinweis: die Entsprechenden Wahlkreisnummern (ost) sind: ## 12:17, 56:86, 151:166,189:196, nutzen Sie den ## Operator "%in%". Falls Ihnen nicht klar ist, ## was "%in%" macht, können Sie die Hilfe dazu mit ## ?"%in%" aufrufen. ## i) (5 Punkte) Speichern Sie nun den Teildatensatz der nur die Wahlergebnisse ## für die AfD enthält in der Variable "subset_partei" ab. Regressieren ## Sie nun für diesen Teildatensatz die Variable "AnteilStimmen" auf ## das logarithmierte "ProKopfBIP" sowie die Variablen "ALQinsgesamt", ## "Auslaenderanteil","Bevoelkerungsdichte" , "Geburtensaldo" , ## "KitaPlaetze" und "ost". Speichern Sie das Ergebnis in der ## Variable "lm_afd" ab und wenden sie darauf die summary-Funktion an. ## j) (5 Punkte) Schreiben Sie nun eine Funktion "ParteiErgebnis", die ## bei Eingabe eines Parteinamens die Regressionsschätzung der ## vorigen Teilaufgabe ausführt und das zugehörige summary-Objekt ## zurückgibt. Testen Sie die Funktion, indem Sie diese auf die Partei ## "Linke" und "FDP" anwenden. Ändert sich das Vorzeichen des Koeffizienten ## von "ost"? Was können Sie sich als mögliche inhaltliche ## Erklärung dafür vorstellen? ###################################################### # Aufgabe 2 (20 Punkte): ###################################################### ## a) (7 Punkte) Schreiben Sie eine Funktion "ttest", die bei ## Eingabe zweier Vektoren x und y einen Zwei-Stichproben-T-Test ## zur Nullhypothese mu_x = mu_y durchführt und den Wert ## der Teststatistik zurückgibt. ## ## Hinweise: die Teststatistik in diesem Fall ist definiert als ## T = ( n*m /(n+m) )^0.5 * ( m_x - m_y )/ S , dabei ist S die ## Quadratwurzel von ## ( (n-1) * s_x^2 + (m-1) * s_y^2 ) / (n+m-2) , ## n und m bezeichnen die Anzahl der Beobachtungen von x bzw. y, ## m_x, m_y und s_x, s_y sind Mittelwert und Stichproben- ## Standardabweichung von x bzw. y. ## b) (6 Punkte) Initialisieren Sie nun einen Leervektor "TStats" ## der Länge 300, setzen Sie den Zufallsgenerator auf die Position 111. ## Benutzen Sie nun eine Schleife um r=300 mal Zufallsvektoren ## x und y der Länge 10 zu realisieren. x sei normalverteilt mit ## Mittelwert 0.5 und Varianz 4, y sei gleichverteilt über dem ## Intervall [0,1]. Benutzen Sie nun Ihre Funktion "ttest" der ## vorigen Teilaufgabe und und speichern Sie das jeweilige Ergebnis ## in TStats ab. ## c) (3 Punkte) Zeichnen Sie nun ein Histogramm von TStats, fügen ## Sie zusätzlich die Dichtefunktion der t-Verteilung mit 18 ## Freiheitsgraden hinzu. ## d) (4 Punkte) Sichern Sie nun zusätzlich Ihre Funktion "ttest" ## gegenüber Fehleingaben ab. Testen Sie Ihre Lösung mit ttest( x = "abdc" , y = 1:10) ttest( x = rnorm(100) , y = list(1:10)) ttest( x = rnorm(100) , y = matrix(0 , ncol = 2 , nrow = 2) ) ###################################################### # Aufgabe 3 (8 Punkte): ###################################################### ## Sehen Sie sich die folgenden beiden Funktionen an. lustigeFunktion<-function(z){if(z<0|trunc(z)!=z)stop("Nur nichtnegative ganzzahlige Eingaben erlaubt!") if(z<=1)return(1)else return(z*lustigeFunktion(z-1))} lustigeFunktionVec<-Vectorize(lustigeFunktion) ## a) (3 Punkte) Schreiben Sie zunächst "lustigeFunktion" so um, ## dass sie besser lesbar ist. Kommentieren Sie dann jede ## (wesentliche) Zeile der von Ihnen neu definierten Funktion. ## b) (5 Punkte) Geben Sie nun in eigenen Worten wieder, was die ## Funktion berechnet. Erklären Sie außerdem, was der Unterschied ## zwischen lustigeFunktion und lustigeFunktionVec ist. Wenden ## Sie beide Funktionen auf ein passendes Objekt an und finden ## Sie die entsprechende in R bereits implementierte Funktion. ###################################################### # Aufgabe 4 (9 Punkte): ###################################################### ## Gegeben ist die Funktion "negLogLik", die für einen Parametervektor "params" der Länge 2 ## und einem bereits vorhandenen Vektor "data" die negative (log-) Likelihood berechnet, ## unter der Annahme, dass die Elemente des Vektors "data" Realisationen einer ## iid normalverteilten Zufallsvariable sind. negLogLik <- function(params){ mu <- params[1] sigma <- params[2] if (sigma < 0) return(Inf) ## in der nächsten Zeile werden "data", "mu" und "sigma" übergeben logLik <- sum( dnorm( data , mean = mu , sd = sigma, log = TRUE) ) -logLik } ## a) (4 Punkte) Realisieren Sie mit einem seed von 123 einen normalverteilten ## Zufallsvektor "data" der Länge 200 mit Erwartungswert 20 und Varianz 4 und ## optimieren (minimieren) Sie gegeben dieser Daten die Funktion "negLogLik". ## Versuchen Sie dabei folgende Startwerte: start1 <- c(0,1) start2 <- c(0,3) start3 <- c(100,3) ## b) (5 Punkte) Schreiben Sie nun eine Funktion "MeanSdMaxLik" die bei ## Übergabe eines Datenvektors "data" das Minimum der Funktion "negLogLik" ## berechnet und die beiden Werte "mu" und "sigma" in einer Liste zurückgibt. ## ## Hinweis: Definieren Sie innerhalb der Funktion "MeanSdMaxLik" noch einmal die ## Funktion "negLogLik" von oben und führen sie auf dieser dann in der ## Funktion "MeansSdMaxLik" die Optimierung durch. Entscheiden Sie sich ## für einen der Startwerte von oben. ## Dadurch, dass "data" ein Argument der äußeren Funktion ist, und negLigLik ## innerhalb dieser Funktion definiert wurde, brauchen Sie sich um die richtige ## Übergabe von data nicht mehr zu kümmern. ###################################################### # Ende ######################################################