"anova_faes" <- function(x, P = 0.95, zweif = FALSE, n.i = 1, n.j = 1, erweitert = FALSE) { #----------------------------------------------- # ANOVA-Variante r-statistik.de # # Grundlage: http://www.faes.de/Basis/Basis-Lexikon/Basis-Lexikon-Multivariate/Basis-Lexikon-Varianzanalyse/basis-lexikon-varianzanalyse.html # # Entwickelt durch: G. Faes # E-Mail: guenter@faes.de # Datum: 11.05.2009 21:19:03 Version: 1.0a # R-Version: 2.5.0 #----------------------------------------------- # P ist die Wahrscheinlichkeit auf der die Aussage getroffen werden soll. # Wird keine Angabe gemacht, wird die Wahrscheinlichkeit mit 0.95 (95%) angenommen. # Mit dieser Funktion kann eine Ein- oder Zweifaktorielle Varianzanlyse duchgeführt # werden. Wird das Argument zweif = TRUE gesetzt wird von einer Zweifaktoriellen # Varianzanalyse ausgegangen. Dann müssen auch die Argumente n.i und n.j gesetzt # werden. Siehe dazu Grundlage -> Abbildung 15. # Wird im Rahmen der Zweifaktoriellen ANOVA das Argument erweitert = TRUE gesetzt, # werden weitere "Zwischenergebnisse" zur Information ausgegeben. # # Die Resultate werden als Text ausgegeben, ein Funktionsergebnis über return() # wird nicht zur Verfügung gestellt. #----------------------------------------------- # Variablenindizierung: dim_Matrix <- dim(x) # Dimension der Matrix x ermitteln dim_n <- dim_Matrix[c(2)] # Anzahl der Schleifendurchläufe ermitteln (horinzontal) dim_m <- dim_Matrix[c(1)] # Anzahl der Schleifendurchläufe ermitteln (vertikal) Daten <- NULL # Nimmt den übergebenden Datensatz auf mw <- NULL # Mittelwert-Vektor s_abw <- NULL # Standardabweichung-Vektor n_g <- NULL # Gesamtanzahl der Werte mw_g <- NULL # Gesamtmittelwert mw_spalten <- NULL # Spaltenmittelwerte SSt <- NULL # Summe der quadratischen Gesamtabweichung SSb <- NULL # Summe der quadr. Abweichungen zwischen den Faktorenstufen SSw <- NULL # Summe der quadr. Abweichungen innerhalb der Faktorenstufen df.SSt <- NULL # Freiheitsgrad SSt df.SSb <- NULL # Freiheitsgrad SSb df.SSw <- NULL # Freiheitsgrad SSw df.SSz <- NULL # Freiheitsgrad SSz df.SSs <- NULL # Freiheitsgrad SSs df.SSz.s <- NULL # Freiheitsgrad SSz.s s.SSt <- NULL # Varainz SSt s.SSb <- NULL # Varianz SSb s.SSw <- NULL # Varianz SSw s.SSz <- NULL # Varianz SSz s.SSs <- NULL # Varianz SSs s.SSz.s <- NULL # Varianz SSz.s PG <- NULL # Prüfgröße PG.z <- NULL # Prüfgröße Varianz s.SSz PG.s <- NULL # Prüfgröße Varianz s.SSs PG.z.s <- NULL # Prüfgröße Varianz s.SSz.s F.Wert <- NULL # Wert der F-Verteilung F.z.Wert <- NULL # Wert der F-Verteilung für "Zeilen"-Faktor F.s.Wert <- NULL # Wert der F-Verteilung für "Spalten"-Faktor F.z.s.Wert <- NULL # Wert der F-Verteilung für die Wechselwirkung Hypothese <- NULL # Welche Hypothese muss angenommen werden? Hypothese.z <- NULL # siehe oben (Varianz s.SSz) Hypothese.s <- NULL # siehe oben (Varianz s.SSs) Hypothese.z.s <- NULL # siehe oben (Varianz s.SSz.s) mw_z <- NULL # Hilfsvektor Zeilenmittelwert mw_s <- NULL # Hilfsvektor Spaltenmittelwert SSz <- NULL # Summe der quadr. Abweichungen der Zeilenmittelwerte SSs <- NULL # Summe der quadr. Abweichungen der Spaltenmittelwerte SSz.s <- NULL # Summe der quadr. Abweichungen zwischen den Zeilen-/Spaltenmittelwerten I; J <- NULL # for-Schleifenzähler Abbruch <- FALSE # Zur Prüfung auf Abbruchkriterium F.Info <- NULL # Funktionsinfo (Abbruch, ....) # Berechnungsteil: # Zweifaktorielle ANOVA ohne Angabe von n.i und/oder n.j? if (zweif == TRUE) { if (n.i <= 1) {Abbruch = TRUE} if (n.j <= 1) {Abbruch = TRUE} } #Abbruchkriterium gesetzt? if (Abbruch == TRUE) { F.Info <- "n.i oder n.j nicht korrekt gesetzt, Berechnung abgebrochen!" return(F.Info) # Programmabbruch! } # Abbruchkriterium # Zur Übersicht umspeichern: Daten <- x # Prüfen ob NA's in der Matrix vorhanden sind: for (I in 1:dim_n) { for (J in 1:dim_m) { Abbruch <- is.na(Daten[J,I]) if (Abbruch == TRUE) break # J-Schleifenabbruch! } if (Abbruch == TRUE) break # I-Schleifenabbruch! } # Ende der Fehlende-Werte-Ermittlung # Fehlende Werte vorhanden? if (Abbruch == TRUE) { F.Info <- "Fehlende(r) Wert(e) vorhanden, Berechnung abgebrochen!" return(F.Info) # Programmabbruch! } else { # Nur weiter, wenn Werte komplett vorhanden: for (I in 1:dim_n) { # Mittelwert: mw[I] <- mean(Daten[I]) # Standardabweichung: s_abw[I] <- sd(Daten[I]) } # Berechnung des Gesamtmittelweretes: n_g <- dim_n * dim_m mw_g <- (sum(Daten) / n_g) # Berechnung SSt: SSt <- sum((Daten - mw_g)^2) # --- Einfaktorielle Varainazanalyse: --- if (zweif == FALSE) { # Berechnung SSb: SSb <- dim_m * (sum((mw - mw_g)^2)) # Berechnung SSw: SSw <- numeric(dim_n) for (I in 1:dim_n) { SSw[I] <- sum((Daten[I] - mw[I])^2) } SSw <- sum(SSw) #Freiheitsgrade: df.SSt <- n_g - 1 df.SSb <- dim_n -1 df.SSw <- dim_n * (dim_m -1) # Varianzen: s.SSt <- SSt / df.SSt s.SSb <- SSb / df.SSb s.SSw <- SSw / df.SSw # Prüfgröße: PG <- s.SSb / s.SSw # Ermittlung des F-Wertes der F-Verteilung: F.Wert <- qf(P, df.SSb, df.SSw) # Hypothese prüfen: if (PG < F.Wert) { Hypothese <- "Nullhypothese trifft zu!" } else { Hypothese <- "Alternativhypothese trifft zu!" } } # Einfaktorielle ANOVA # --- Zweifaktorielle Varainazanalyse: --- if (zweif == TRUE) { # SS-Zeilen ermitteln (siehe Grundlage Formel 16!) # for-Parameter festlegen: von <- 1 bis <- dim_n / n.j for (I in von:bis) { mw_z[I] <- mean(mw[c(von:(von+(n.j-1)))]) # Zeilenmittelwerte von <- von + n.j } # for-Schleife SS-Zeilen # Berechnung SSz SSz <- n.j * dim_m * (sum((mw_z - mw_g)^2)) # SS-Spalten ermitteln (siehe Grundlage Formel 17!) # Vorbelegungen: mw_spalten <- array(0, c(n.j, n.i)) von <- 1 bis_I <- dim_n / n.j for (J in von:n.j) { zeile <- J spalte <- 1 position <- J for (I in von:bis_I) { mw_spalten[zeile,spalte] <- mw[position] # Spaltenmittelwerte position <- position + n.j spalte <- spalte + 1 } # I-Schleife # SS-Spalten ermitteln mw_s[J] <- mean(mw_spalten[J,]) } # J-Schleife # Berechnung SSs: SSs <- n.i * dim_m * (sum((mw_s - mw_g)^2)) # Berechnung Wechselwirkung Zeile/Spalte (siehe Grundlage Formel 18) x_stern <- array(0, c(n.j, n.i)) # Vorbelegungen for (J in 1:n.j) { for (I in 1:n.i) { x_stern[J,I] <- mw_z[I] + mw_s[J] } } x_stern <- x_stern - mw_g SSz.s <- sum(dim_m * (mw_spalten - x_stern)^2) # Berechnung SSb (siehe Grundlage Formel 19!) SSb <- SSz + SSs + SSz.s # Berechnung SSw (Streuungzerlegung...) SSw <- SSt - SSb # Freiheitsgrade: df.SSz <- n.i - 1 df.SSs <- n.j - 1 df.SSz.s <- (n.i - 1) * (n.j - 1) df.SSw <- n.i * n.j * (dim_m - 1) df.SSt <- n.i * n.j * dim_m - 1 # Varianzen: s.SSz <- SSz / df.SSz s.SSs <- SSs / df.SSs s.SSz.s <- SSz.s / df.SSz.s s.SSw <- SSw / df.SSw s.SSt <- SSt / df.SSt # Prüfgrößen: PG.z <- s.SSz / s.SSw PG.s <- s.SSs / s.SSw PG.z.s <- s.SSz.s/ s.SSw # F-Werte: F.z.Wert <- qf(P, df.SSz, df.SSw) F.s.Wert <- qf(P, df.SSs, df.SSw) F.z.s.Wert <- qf(P, df.SSz.s, df.SSw) # Vergleich Prüfgröße mit F-Werte: if (PG.z < F.z.Wert) { Hypothese.z <- "Haupteinfluss Zeile: Nullhypothese trifft zu!" } else { Hypothese.z <- "Haupteinfluss Zeile: Alternativhypothese trifft zu!" } if (PG.s < F.s.Wert) { Hypothese.s <- "Haupteinfluss Spalte: Nullhypothese trifft zu!" } else { Hypothese.s <- "Haupteinfluss Spalte: Alternativhypothese trifft zu!" } if (PG.z.s < F.z.s.Wert) { Hypothese.z.s <- "Wechselwirkung Zeile/Spalte: Nullhypothese trifft zu!" } else { Hypothese.z.s <- "Wechselwirkung Zeile/Spalte: Alternativhypothese trifft zu!" } } # Zweifaktorielle ANOVA } # else-Teil fehlende Wert-Prüfung # Ergebnisausgabe: Merkmale <- names(Daten) Mittelwerte <- mw Standardabweichungen <- s_abw Info_Frame1 <- data.frame(Merkmale, Mittelwerte, Standardabweichungen) cat("\n", "------------------------------------------", "\n") if (zweif == FALSE) { # Ausgabe einfaktorielle ANOVA cat("Einfaktorielle Varianzanalyse (ANOVA):", "\n") Info_Frame2 <- data.frame(SSt, SSb, SSw) Info_Frame3 <- data.frame(df.SSt, df.SSb, df.SSw) Info_Frame4 <- data.frame(s.SSt, s.SSb, s.SSw) # Ausgabe: cat("\n") print(Info_Frame1) cat("\n") cat("Gesamtmittelwert: ", mw_g, " Gesamtanzahl der Werte:", n_g, "\n") cat("\n") cat("Abweichungsquadrate SSt = SSb + SSw", "\n") print(Info_Frame2) cat("\n") cat("Freiheitsgrade:" , "\n") print(Info_Frame3) cat("Varianzen:" ,"\n") print(Info_Frame4) cat("\n") cat("Pruefgroesse PG: ", PG, " Wert der F-Verteilung (P=", P*100, "%): ", F.Wert, "\n") cat("Nullhypothese: Kein Unterschied innerhalb des unabhaengigen Merkmals, wenn PG < F-Wert.", "\n") cat("Alternativhypothese: Es besteht ein Unterschied innerhalb des unabhaengigen Merkmals, wenn PG > F-Wert.", "\n") cat("Ergebnis mit P=", P*100, "%: ", Hypothese, "\n") } # Ende Ausgabe einfaktorielle ANOVA if (zweif == TRUE) { # Ausgabe mehrfaktorielle ANOVA cat("Zweifaktorielle Varianzanalyse (ANOVA):", "\n") cat("\n") print(Info_Frame1) cat("\n") cat("Gesamtmittelwert: ", mw_g, " Gesamtanzahl der Werte:", n_g, "\n") cat("\n") if (erweitert == TRUE) { cat("SSt (F15) : ", round(SSt, digits = 3), "df: ", df.SSt, "\n") cat("SS-Zeilen (F16) : ", round(SSz, digits = 3), "df: ", df.SSz, "\n") cat("SS-Spalten (F17): ", round(SSs, digits = 3), "df: ", df.SSs, "\n") cat("SS-Z/S (F18) : ", round(SSz.s, digits = 3), "df: ", df.SSz.s, "\n") cat("SSb (F19) : ", round(SSb, digits = 3), "\n") cat("SSw (Streuungszerlegung!): ", round(SSw, digits = 3), "df: ", df.SSw, "\n") cat("Varianzen:", "\n") Info_Frame2 <- data.frame(s.SSz, s.SSs, s.SSz.s, s.SSw, s.SSt) print(Info_Frame2) } cat("\n") cat("Varianzherkunft nach Tabelle 18:", "\n") cat("(Wahrscheinlichkeit P=", P*100, "%)", "\n") cat("PG Zeile:", PG.z, "Wert F-Verteilung:",F.z.Wert, "\n") cat(" ", Hypothese.z, "\n") cat("PG Spalte:", PG.s, "Wert F-Verteilung:",F.s.Wert, "\n") cat(" ", Hypothese.s, "\n") cat("PG Wechselwirkung Zeile/Spalte:", PG.z.s, "Wert F-Verteilung:",F.z.s.Wert, "\n") cat(" ", Hypothese.z.s, "\n") cat("\n") } # Ende Ausgabe mehrfaktorielle ANOVA cat("------------------------------------------", "\n") cat("\n") } # Funktions-Ende