"Lorenz" <- function(x, grafik = TRUE, ...) { #----------------------------------------------- # Lorenzkurve und Gini-Koeffizient # # Siehe: http://www.faes.de/Basis/Basis-Lexikon/Basis-Lexikon-Lorenz-Kurve/basis-lexikon-lorenz-kurve.html # # Entwickelt durch: G. Faes # E-Mail: guenter@faes.de # Datum: 10.09.2007 19:35 Version: 1.0 # R-Version: 2.5.1 #----------------------------------------------- # Variablenindizierung: Daten <- NULL # Nimmt die Übergabedaten auf Daten_dim <- NULL # Dimension der Datenmatrix festestellen dim_n <- NULL # Anzahl Zeilen dim_m <- NULL # Anzahl Spalten Summe <- NULL # Summe der Merkmalsausprägung Name.Spalte.1 <- "" # Nimmt die Bezeichnung der 1. Spalte auf Name.Spalte.2 <- "" # Nimmt die Bezeichnung der 2. Spalte auf Temp_k <- NULL # Hilfsvaraible sortieren Temp_g <- NULL # " " Anzahl <- NULL # Anzahl Merkmalsausprägungen Anteil_u <- NULL # Anteil Merkmalsträger u Anteil_v <- NULL # Anteil Merkmalsträger v Ausgabe_Tabelle <- NULL # Ausgabe der Merkmalstabelle Gini <- NULL # Ginikoeffizient Gini_Norm <- NULL # Ginikoeffizient, normiert Summe_Nenner <- NULL # Summe Nenner für Ginikoeffizient Summe_Zaehler <- NULL # Summe Zähler für Ginikoeffizient i_Vektor <- NULL # Hilfsvektor zur Zählerberechnung I; J <- NULL # for-Schleifenzähler Abbruch <- FALSE # Zur Prüfung des Abbruchkriteriums F.Info <- NULL # Funktionsinfo (Abbruch, ....) # Berechnungsteil: Daten <- data.frame(x) # Datenübergabe in einen Frame Daten_dim <- dim(Daten) dim_n <- Daten_dim[1] dim_m <- Daten_dim[2] Name.Spalte.1 <- names(Daten[1]) # Bezeichnung der 1. Spalte Name.Spalte.2 <- names(Daten[2]) # Bezeichnung der 2. Spalte # Abbruch prüfen: if (dim_m > 2) {Abbruch <- TRUE} #Abbruchkriterium gesetzt? if (Abbruch == TRUE) { F.Info <- "Mehr als 2 Spalten, Berechnung abgebrochen!" return(F.Info) # Programmabbruch! } # Abbruchkriterium # Daten sortieren: for (I in 1:dim_n) { for (J in I:dim_n) { if (Daten[J,2] < Daten[I,2]) { Temp_k <- Daten[J,] # Zwischenspeicherung kleiner Wert Temp_g <- Daten[I,] # Zwischenspeicherung größerer Wert Daten[I,] <- Temp_k Daten[J,] <- Temp_g } # if-Schleife } # Ende J-Schleife } # Ende I-Schleife # Berechnung: # Lorenz: Anzahl <- dim_n Summe <- sum(Daten[,2]) Anteil_u <- rep((1 / Anzahl), Anzahl) # Der theoretische Anteil der Merklamsausprägungen bei Gleichverteilung Anteil_u <- cumsum(Anteil_u) # Zur grafischen Ausgabe der Idealline Anteil_v <- round(cumsum(Daten[,2] / Summe), digits = 3) # Der tatsächliche Anteil der Merklamsausprägungen Anteile <- data.frame(Daten[1],Anteil_u, Anteil_v) Ausgabe <- merge(Daten, Anteile, sort = FALSE) # Gini: Summe_Nenner <- dim_n * (sum(Ausgabe[,2])) i_Vektor <- rep(1:dim_n) Summe_Zaehler <- 2 * (sum(i_Vektor * Ausgabe[,2])) Gini <- Summe_Zaehler / Summe_Nenner - ((dim_n + 1) / dim_n) Gini_Norm <- Gini * (dim_n / (dim_n - 1)) # Ergebnisausgabe: #Datenausgabe: cat("\n") cat("Lorenzkurve zur Konzentrationsverteilung", "\n", "\n") cat("Anteile der Merkmalsträger:", "\n", "\n") print(Ausgabe) cat("\n") cat("Gini-Koeffizient: ", Gini, "\n") cat("Gini-Koeffizient, normiert: ", Gini_Norm, "\n", "\n") #Grafikausgabe: if (grafik == TRUE) { plot(Ausgabe[,4], type ="b", xlab = Name.Spalte.1, ylab = "Kummulierte Merkmalssumme", col= "red", ...) lines(Ausgabe[,3], col= "blue") } # Grafikausgabe } # Funktions-Ende