[fbf06f]: / partyMod / inst / RR / Rieger_RF_NA / funktionenZumDGP.R

Download this file

165 lines (143 with data), 7.0 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
##############################################################################
# #
# R-Code zur HiWi-Stelle #
# #
# Teil 1: #
# Funktionen zum datengenerierenden Prozess #
# #
##############################################################################
#library("mvtnorm", lib.loc = "~/lib/oldmvtnorm/")
# Funktion zum datengenerierenden Prozess 1 *dgp1*:
# erzeugt niter Datensätze mit je n Beobachtungen aus 5 multivariat normalver-
# teilten Zufallsvariablen mit Erwartungswert Null, beliebiger Varianz
# ("sigma") und dem binären Response y (ein Faktor). Der Einfluss der einzel-
# nen Kovariablen kann mittels "coef" beliebig verändert werden. Zusätzlich
# werden w multivariat normalverteile Zufallsvariablen (ebenfalls je n Beo-
# bachtungen) gezogen, welche keinen Einfluss auf den Response haben.
dgp1 <- function(niter = 5, n = 100, sigma = diag(rep(1, 5)), coef = 1:5, w = 0) {
#************************************************************************#
# aufbauend auf der Funktion "create" aus Svejdar (2007) #
#************************************************************************#
#
# Eingabe
# niter: Anzahl der Datensätze
# n: Anzahl der Beobachtungen je Datensatz
# sigma: Kovarianzmatrix, default: Einheitsmatrix
# coef: Einfluss der einzelnen Kovariablen x_i
# w: Anzahl der Noise-Parameter
# Ausgabe
# datsimul: Liste der Datensätze
stopifnot(require("mvtnorm"))
# lädt Paket "mvtnorm", falls noch nicht geschehen
datsimul <- list()
for (i in 1:niter) {
# wahre Parameter:
X <- rmvnorm(n, mean = rep(0, 5), sigma = sigma)
# der Erwartungswert ist Null
# Response:
pi <- as.vector( exp(X %*% coef)/(1 + exp(X %*% coef)) )
# Wahrscheinlichkeit, in Klasse 2 zu fallen; nach Formel (4.1) aus
# Svejdar (2007)
y <- rbinom(n, 1, pi) + 1
# +1, da nicht 0-1-kodiert, sondern 1-2
# mit Noise-Parameter:
if (w > 0) {
W <- rmvnorm(n, mean = rep(0, w), sigma = diag(rep(1, w)))
# Datensatz:
dat <- as.data.frame(cbind(y, X, W))
dat$y <- as.factor(y)
names(dat) <- c("y", paste("x", 1:5, sep = ""),
paste("w", 1:w, sep = ""))
}
# ohne Noise-Parameter:
if (w == 0) {
# Datensatz:
dat <- as.data.frame(cbind(y, X))
dat$y <- as.factor(y)
names(dat) <- c("y", paste("x", 1:5, sep = ""))
}
if (w < 0) { stop("Falsche Anzahl an Noise-Parametern w: ", w) }
datsimul[[i]] <- dat
}
return(datsimul)
}
# Test:
#d <- dgp1(n=30)
#class(d[[1]]$y)
#rm(d)
#****************************************************************************#
# Funktion zum datengenerierenden Prozess 2 *dgp2*:
# erzeugt niter Datensätze mit je n Beobachtungen aus 5 multivariat gleichver-
# teilten Zufallsvariablen auf [0, 1], beliebiger Varianz ("sigma") und dem
# Response y, der nach dem Regressionsproblem "Friedman 1" aus Friedman (1991)
# berechnet wird. Zusätzlich werden u multivariat gleichverteile Zufallsvariab-
# len (ebenfalls je n Beobachtungen) gezogen, welche keinen Einfluss auf den
# Response haben.
# Für Details siehe:
# R> library(mlbench)
# R> ?mlbench.friedman1
dgp2 <- function(niter = 5, n = 100, sigma = diag(rep(1, 5)), u = 5) {
# Eingabe
# niter: Anzahl der Datensätze
# n: Anzahl der Beobachtungen je Datensatz
# sigma: Kovarianzmatrix, default: Einheitsmatrix
# u: Anzahl der Noise-Parameter
# Ausgabe
# datsimul: die niter Datensätze
stopifnot(require("mvtnorm"))
# lädt Paket "mvtnorm", falls noch nicht geschehen
datsimul <- list()
if (u < 0) { stop("Falsche Anzahl an Noise-Parametern u: ", u) }
for (i in 1:niter) {
# Die gezogenen Zufallsvariablen sind gleichverteilt:
# Vektor p speichert die p-Werte des KS-Tests. Falls ein Element von p
# kleiner als 0.05 ist, wird die Nullhypothese U[,j] ~ U([0, 1]) abge-
# lehnt. Damit mindestens einmal Daten gezogen werden, wird p auf 0.01
# gesetzt.
# wahre Parameter:
p <- rep(0.01, 5)
while(all(p <= 0.05)) {
# hier Überprüfung, ob alle U[,j]'s gleichverteilt sind; falls ja,
# wird die while-Schleife verlassen
X <- rmvnorm(n, mean = rep(0, 5), sigma = sigma)
# der Erwartungswert ist Null
U <- apply(X, 2, pnorm)
# 2 für spaltenweise Anwendung von apply
for (j in 1:5) {
p[j] <- ks.test(U[, j], y = punif, exact = FALSE)$p.value
# bei Bindungen ist exact = FALSE nötig
}
}
# Response:
y <- 10*sin(pi*U[, 1]*U[, 2]) + 20*(U[, 3] - 0.5)^2 + 10*U[, 4] + 5*U[, 5]
# Berechnung nach Friedman1 (s. o.)
# Noise-Parameter:
p <- rep(0.01, 5)
while(all(p <= 0.05)) {
# hier Überprüfung, ob alle V[,j]'s gleichverteilt sind; falls ja,
# wird die while-Schleife verlassen
W <- rmvnorm( n, mean = rep(0, u), sigma = diag(rep(1, u)) )
V <- apply(W, 2, pnorm)
# 2 für spaltenweise Anwendung von apply
for (j in 1:u) {
p[j] <- ks.test(V[,j], y=punif)$p.value
}
}
dat <- as.data.frame(cbind(y, U, V))
names(dat) <- c("y", paste("x", 1:5, sep = ""),
paste("u", 1:u, sep = ""))
datsimul[[i]] <- dat
}
return(datsimul)
}
# Test:
#dgp2(n = 30, sigma = sigma[[2]], u = 25)
##############################################################################
# Literatur: #
# #
# * Viola Svejdar: "Variablenselektion in Klassifikationsbäumen unter spezi- #
# eller Berücksichtigung von fehlenden Werten", Diplomarbeit, Ludwig-Maxi- #
# milians-Universität, München, 2007 #
# * Friedman, Jerome H.: "Multivariate adaptive regression splines", 1991 #
# The Annals of Statistics 19 (1), pages 1-67. #
##############################################################################