#******************************************************************************************
#******************************************************************************************
#******************************************************************************************
# R Tutorium
#******************************************************************************************
#******************************************************************************************
#******************************************************************************************

#******************************************************************************************
#******************************************************************************************
# Basics
#******************************************************************************************
#******************************************************************************************

x <- "Hello World!"	  # assign a string to a variable x

x <- 10		 	          # assign a scalar to a variable x 
# wichtig bei Neuzuordnung eines Werts zur Variable x wird der vorherige Wert ueberschrieben insbesondere Ã¤ndert sich hier der Datentyp

#******************************************************************************************
# Vektoren
#******************************************************************************************

x <- c(1, 2, 3, 4, 5)	# c ist die Kurzform fuer concatenate
x <- seq(1, 10, 2)  	# Sequenz von 1 bis 10, in Schrittweite 2
x <- 1 : 10         	# Kurzform fuer Sequenz der Schrittweite 1
x[1] 			            # Wert des Vektors x an der Stelle 1 Indizes starten bei 1 in R das Element x[0] existiert nicht!
x <- x[-1]		        # Vektor x wird ueberschrieben, das Element an Stelle 1 dabei ignoriert 
x[x < 3]      		    # Alle Elemente von x, deren Wert kleiner 3 ist

#******************************************************************************************
# Matrix
#******************************************************************************************

d <- c(1 : 10) 		    # Sequenz von 1 bis 10
x <- matrix(data = d, nrow = 5, ncol = 2, byrow = TRUE)  # Erstellt eine Matrix aus den Daten d, welche 5 Zeilen und 2 Spalten hat
View(x) 			        # Ã–ffne x zur Ansicht
x 				            # print x in console

#******************************************************************************************
# Dataframe
#******************************************************************************************

x_d <- as.data.frame(x)                   # Erstellt einen data.frame aus der Matrix x (vorherige Folie)
colnames(x_d) <- c("Spalte1", "Spalte2")  # Benennung der Spalten des data.frame

x_d[, 1]          	    # alle Werte der ersten Spalte
x_d$Spalte2      	      # alle Werte der Spalte 2 
x_d$Spalte1[1 : 3] 	    # Werte der ersten drei Zeilen von Spalte 1
x_d$Spalte3 <- x_d$Spalte1 + 2 * x_d$Spalte2
                        # Hinzufuegen einer neuen Spalte â€žSpalte3â€œ
x_d <- x_d[, -2]	      # Loeschen von Spalte2
x_d$Spalte2 <- NULL     # Alternative zum Loeschen
x_d[x_d$Spalte3 > 5, ]	# Filtern der Zeilen
x_d[order(x_d$Spalte3), ]	
                        # Sortieren der Zeilen nach Spalte3

#******************************************************************************************
# Bedingungen
#******************************************************************************************

examResult <- 2.0
if(examResult <= 4.0){
  print("Pruefung bestanden")
}

if(examResult == 1.0){
  print("Glueckwunsch zur 1.0!")
}else if(examResult <= 4.0){
  print(paste("Du hast die Klausur mit einer", examResult, "bestanden."))
}else{
  print("Leider musst du in die Nachklausur.")
}

#******************************************************************************************
# Schleifen
#******************************************************************************************

# for Schleife
x <- c(1, 3, 5, 10, 15)	# Initialisierung der Vektoren x, z
y <- c(2, 7, 8, 12, 17)
z <- c()

for(i in 1 : 5){
  print(i)
  z[i] <- x[i] + y[i]	# Addiere zu jedem Vektorelement von z das Vektorelement von x	
}
print(z)

# Grundsätzlich sollte man hier in der Praxis Vektorisierung nutzen, da dies bei weitem
# effizienter und damit schneller ist, also 

x <- c(1, 3, 5, 10, 15)	# Initialisierung der Vektoren x, z
y <- c(2, 7, 8, 12, 17)

z <- x + y
print(z)

# while Schleife
i <- 1

while(i < 5){
  z[i] <- z[i] + x[i]
  i <- i + 1	  # die ZÃ¤hlvariable muss manuell verÃ¤ndert werden
}
print(z)

#******************************************************************************************
# Funktionen
#******************************************************************************************

# Beispiel Berechnung des Mittelwerts mit Hilfe der Funktion mean()
x <- c(1, 2, 3, 4, 5)
mean(x, na.rm = TRUE)	# Objekt x als notwendiger Inputparameter
# weitere moegliche Inputparameter sind bspw. na.rm; hierbei werden moegliche NA Werte entfernt


# Erstellung eigener Funktionen
# mit dem Schluesselwort function sagen wir, dass myFunction eine Funktion sein soll
# in den runden Klammern geben wir Inputparameter input1,â€¦,inputN ein

# Um herauszufinde, wer gerade angemeldet ist, nutzt man nachfolgende Ausdruch 
user <- Sys.info()['user']

# Erste eigene Funktion
greetings <- function(name){
  print(paste("Hallo ", name, sep = ""))
}
# Aufruf der Funktion
greetings(user)	


# Berechnung des Kapitalwerts eines Zahlungsstroms cashFlow (Vektor) mit Kalkulationszinssatz discountRate
calculatePresentValue <- function(cashFlow, discountRate){
  pv <- 0
  for(t in 1 : length(cashFlow)){ 
    pv <- pv + cashFlow[t] / (1+discountRate)^t
  }
  return(pv)
}

# Aufruf der Funktion fuer Zahlungsstrom cashFlow1 und Kalkulationszinssatz discountRate1
cashFlow1 <- c(100, 120, 160, 130, 145, 95)

discountRate1 <- 0.05

calculatePresentValue(cashFlow1, discountRate1)

# Eigene Funktion zur Berechnung des Bravais-Pearson 

bpCorr <- function(x, y) {
  
  if(length(x)!=length((y))) warning("x und y muessen diesselbe Laenge haben!\n")
  
  cov_xy <- sum((x-mean(x))*(y-mean(y)))
  var_x <- sum((x-mean(x))^2)
  var_y <- sum((y-mean(y))^2)
  corr_xy <- cov_xy/sqrt(var_x*var_y)
  
  return(corr_xy)
  
}

bpCorr(x,y)



x%*%y/(x%*%x * y%*%y)


#******************************************************************************************
#******************************************************************************************
# Datenimport und Datenexport
#******************************************************************************************
#******************************************************************************************

library("readxl")	 # Laden des Packages readxl

# Die Daten stehen im Internet von der Uni Augsburg zum Download bereit
url <- "https://mediastore.rz.uni-augsburg.de/get/9E_Hh9mbqD/"
# Erzeuge einen temporären Ordner zum Ablegen von Dateien aus dem Web.
# Der Ordner wird nach dem Neustart gelöscht.
our_data <- tempfile()
# Lade die gewünschte Excel in den temporären
download.file(url, our_data, mode="wb")
# Nun kann der Inhalt des Ordners in unseren Workspace geladen werden.
our_data <- read_excel(our_data)

View(our_data)

#******************************************************************************************
#******************************************************************************************
# Deskriptive Statistik
#******************************************************************************************
#******************************************************************************************

str(our_data) 		# Struktur des Datensets
names(our_data)		# Spaltennamen
head(our_data)		# Ausgabe der obersten Zeilen
our_data[10 : 20, ] 		# Ausgabe der Zeilen 10 bis 20
nrow(our_data)		# Zeilenanzahl
ncol(our_data) 		# Spaltenanzahl
dim(our_data) 		# Dimensionen (Zeilenanzahl und Spaltenanzahl)

mean(our_data$Besucheranzahl)		          # Berechnung des Erwartungswerts 
median(our_data$Besucheranzahl) 		      # Berechnung des Medians
var(our_data$Besucheranzahl)			        # Berechnung der Varianz 
sd(our_data$Besucheranzahl)			          # Berechnung der Standardabweichung
quantile(our_data$Besucheranzahl, 0.95)	  # Berechnung des q-ten Quantils
summary(our_data$Besucheranzahl) 		      # Summary des Datensatzes
cov(our_data$Besucheranzahl, our_data$Temperatur) # Berechnung der Kovarianz zwischen den Besucheranzahl und Temperatur
cor(our_data$Besucheranzahl, our_data$Temperatur) # Berechnung der Korrelation


#******************************************************************************************
#******************************************************************************************
# Plots
#******************************************************************************************
#******************************************************************************************

#******************************************************************************************
# Scatterplot zwischen Besucheranzahl und Temperatur
#******************************************************************************************
# es lÃ¤sst sich ein linearer Zusammenhang erkennen

plot(our_data$Besucheranzahl, our_data$Temperatur, 
     col  = "black", main = "Schwimmbad", 
     ylab = "Temperatur", xlab = "Besucherzahl") 

#******************************************************************************************
# Linienplot
#******************************************************************************************

plot(our_data$Besucheranzahl,
     type = "l", 
     xlab = "", 
     ylab = "Anzahl", 		
     main = "Besucheranzahl im Schwimmbad",		
     ylim = c(1,700)) 

# Hinzufuegen einer Linie fuer die Variable Temperatur
lines(our_data$Temperatur, type = "l", col = "red")

#******************************************************************************************
# Histogramm
#******************************************************************************************

hist(our_data$Besucheranzahl, 
     breaks = 12, 
     plot = TRUE,
     xlab = "Besucheranzahl",
     main = "Histogramm",
     freq = TRUE,
     col  = "lightgrey",
     border = "red")


#******************************************************************************************
#******************************************************************************************
# Regressionsanalyse
#******************************************************************************************
#******************************************************************************************


#******************************************************************************************
# univariate Regression
#******************************************************************************************


# Einfluss von Temperatur auf die Besucheranzahl
lin_model <- lm("Besucheranzahl ~ Temperatur", data = our_data) 
summary(lin_model)

#******************************************************************************************
# multivariate Regression
#******************************************************************************************

lin_model <- lm("Besucheranzahl ~ .", data = our_data) 
summary(lin_model)
