====== Erzeugen eines balancierten Versuchsplans ====== Auf insgesamt 14 Halbseiten sollen Fehler so verteilt werden, daß alle Fehlertypen und Fehlerorte gleichmäßig häufig auftreten. Fehlertype, hor. und vert. Komponente sind in jeweils 4 Kategorien aufgeteilt. Type <- factor(c("Add","Mis","Rev","Sha")) # Fehlertyp Col <- factor(c("A","B","C","D")) # hor. Ort Zeile <- 1:4 # bleibt numerisch, da die Zeilenzahl 1:28 umfaßt Zunächst werden alle Kombinationen von Fehler und Ort aufgelistet und zufällig gemischt: de <- expand.grid(Type=Type,Col=Col,Zeile=Zeile) de.s <- de[sample(1:64),] # Sample ohne Replikation -> Permutation Danach wird eine Verteilung auf die Halbseiten vorgenommen. Es sind 64 Fehler auf 14 Halbseiten zu verteilen, es sind mindestens 4 und höchstens 6 gewünscht. de.s$pg = c(rep(1:14,each=4), sample(2:13,4),sample(2:13,4)) Der grobe Wert in de.s$Zeile wird noch genau spezifiziert: de.s$Zeile <- de.s$Zeile*7-sample(0:6,64,rep=T) # Sample mit Replikation Außerdem erzeugen wir noch eine Spalte mit Zufallsbuchstaben: de.s$Let <- sample(letters,64,rep=T) Die Liste der Fehler erhält man durch Sortieren nach Halbseite und Zeile: de.s[order(de.s$pg,de.s$Zeile),] Type Col Zeile pg Let 6 Mis B 5 1 t 47 Rev D 15 1 w 33 Add A 16 1 i 57 Add C 24 1 m 3 Rev A 1 2 f 32 Sha D 13 2 q 48 Sha D 21 2 g 45 Add D 21 2 e 60 Sha C 23 2 e 13 Add D 4 3 e 29 Add D 8 3 t 27 Rev C 11 3 s 28 Sha C 13 3 b 23 Rev B 14 3 i 20 Sha A 11 4 g 35 Rev A 16 4 v 59 Rev C 23 4 g 53 Add B 23 4 n 1 Add A 4 5 b 7 Rev B 5 5 g 18 Mis A 8 5 s 43 Rev C 20 5 q 14 Mis D 4 6 m 8 Sha B 4 6 a 30 Mis D 8 6 a 40 Sha B 17 6 o 64 Sha D 27 6 l 49 Add A 28 6 h 5 Add B 7 7 t 19 Rev A 10 7 u 42 Mis C 18 7 g 52 Sha A 24 7 m 56 Sha B 27 7 v 4 Sha A 2 8 u 34 Mis A 16 8 h 44 Sha C 21 8 y 55 Rev B 22 8 w 12 Sha C 2 9 o 24 Sha B 11 9 a 39 Rev B 18 9 u 54 Mis B 28 9 w 15 Rev D 1 10 d 10 Mis C 1 10 r 26 Mis C 13 10 d 46 Mis D 20 10 l 37 Add B 21 10 w 2 Mis A 1 11 f 16 Sha D 1 11 t 17 Add A 14 11 y 36 Sha A 21 11 p 31 Rev D 13 12 a 38 Mis B 19 12 c 41 Add C 20 12 f 50 Mis A 27 12 h 62 Mis D 27 12 d 11 Rev C 2 13 z 9 Add C 6 13 r 21 Add B 10 13 b 25 Add C 10 13 d 61 Add D 25 13 c 22 Mis B 8 14 y 63 Rev D 22 14 e 58 Mis C 23 14 x 51 Rev A 23 14 i > Im 7./8. Eintrag findet man einen möglichen Ortskonflikt (2 Fehler am selben Ort). Alle drei möglichen Konfliktlösungen sind auf ihre Art sinnvoll: - akzeptieren und beide Fehler einbauen - den 2. Fehler um 1 Zeile nach oben oder unten verschieben - ganzen Datensatz verwerfen und neu mischen ===== Beseitigung der Konflikte ===== Wir verpacken die obigen Code-Fragmente in ein Skript, das die Ergebnisse von 6 Durchläufen in eine Datei ''T1.txt'' schreibt. Die Hilfsfunktion ''dez()'' erzeugt Zufallszahlen zwischen 0 und 6, die sich in 4er-Blöcken nicht wiederholen (4mal wird Ziehen ohne Zurücklegen aus 0:6 durchgeführt). dez <- function(){c(sample(0:6,4),sample(0:6,4),sample(0:6,4),sample(0:6,4))} shuffle <- function() { de$Zeile <- 7*rep(1:4,each=16)-dez() de.s <- de[sample(1:64),] # Permutation de.s$pg = c(rep(1:14,each=4), sample(2:13,4),sample(2:13,4)) # de.s$Let <- sample(letters,64,rep=T) de.s <- de.s[order(de.s$pg,de.s$Zeile),] } Damit erhalten Zeilen mit demselben Spaltencode auf jeden Fall verschiedene Zeilennummern. ===== mehr Varianz bei Fehlerzahl pro Seite ===== Wenn mehr Varianz in der Fehlerzahl verlangt wird, ist das obige Verfahren noch nicht optimal. Außerdem soll eine breite Tabelle mit den 6 Werten erzeugt werden. Type <- factor(c("Add","Mis","Rev","Sha")) Col <- factor(c("A","B","C","D")) Zeile <- 1:4 shuffle2 <- function() { Count <- sample(c(rep(2,2),rep(4:6,4))) # Verteilung der Fehlerzahlen de.s <- de[sample(1:64),] # Permutation de.s$pg <- NA; dex= 0 for (pg in 1:14) { jj <- dex+1:Count[pg]; dex <- dex + Count[pg]; de.s$pg[jj] <- pg; de.s$Zeile[jj] <- sort(7*de.s$Zeile[jj] - sample(0:6,length(jj))); } de.s } T1 <- list() for (i in 1:6) { de.s <- shuffle2() de.s$Zeile <- with(de.s,ifelse(pg%%2,Zeile,Zeile+28)) de.s$pg <- (de.s$pg+1) %/%2 T1[[i]] <- de.s[c(4,3,2,1)] } T1.wide <- cbind(T1[[1]],T1[[2]],T1[[3]],T1[[4]],T1[[5]],T1[[6]]) sink("T1.txt") T1.wide sink()