###################################################### # # # 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 ######################################################