====== 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()