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

Download this file

170 lines (140 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
166
167
168
169
170
##############################################################################
# #
# R-Code zur HiWi-Stelle #
# #
# Teil 2b: #
# neue Funktionen zu Missing Values #
# FÜR KLASSIFIKATIONS-BÄUME!!! #
# #
##############################################################################
# Funktion zum Erzeugen von fehlenden Werten per Logit-Modellierung *deleteLOG*:
# erzeugt in einer Liste von Datensätzen pro Zufallsvariable beliebig viele
# fehlende Werte
deleteLOG <- function(datsimul, mv = c(1, 0, 1, 1, 0),
Coeff = list( c(-2.25, rep(1, times=5)), NULL, c(-2.25, rep(1, times=5)),
c(-2.25, rep(1, times=5)) ), ...) {
# Eingabe
# datsimul: Liste von gleich großen Datensätzen (z.B. aus einer *dgp*-
# Funktion)
# mv: Vektor als Indikator für fehlende Werte (missing values); 1 - feh-
# lende Werte einstreuen, 0 - Variable wird voll beobachtet (ohne MVs)
# Coeff: Liste, die pro Eintrag einen Vektor zur zugehörigen Variable enthält,
# der die Berechnung der Logits steuert
# Ausgabe
# Liste von Datensätzen mit zufällig fehlenden Werten
niter <- length(datsimul) # Anzahl erzeugte Datensätze
nvar <- length(mv) # Anzahl der Variablen x1 - xp
n <- nrow(datsimul[[1]]) # Anzahl Beob eines erzeugten Datensatzes
for (i in 1:niter) {
x <- datsimul[[i]][, -1] # speichert nur die Variablen ab
logit.dep <- list()
for (j in 1:nvar) {
if(mv[j] > 0) {
# Logit-Berechnung nur in den Variablen, die im Vektor mv angegeben sind
coeff <- Coeff[[j]]
ld <- coeff[1] # Intercept
for (k in 1:nvar) {
if (k != j) {
ld <- (coeff[k+1] * x[, k]) + ld # [k+1] wegen Intercept
# ld ist Vektor
# z.B. P(X_1 missing) = logit( \sum_{k = 2}^n \beta_{1,k} * X_k) ~~ 0.2
# P(X_3 missing) = logit( \sum_{k = 1,2, 4,5} \beta_{3,k} * X_k) ~~ 0.1
}
}
logit.dep[[j]] <- ld # logit.dep ist Liste von Vektoren
}
}
for (j in 1:nvar) {
if(mv[j] > 0) {
# streichen nur in den Variablen, die im Vektor mv angegeben sind
pNA <- as.vector( exp(logit.dep[[j]])/(1 + exp(logit.dep[[j]])) )
# Wahrscheinlichkeit, in der j-ten Variable einen fehlenden Wert zu haben
kriegtNA <- rbinom(n, 1, pNA)
# n Bernoulli-Experimente, d.h. entweder 0 oder 1 als Ergebnis
cat("Anteil NA in Variable", j, "Datensatz", i, ": ", sum(kriegtNA, na.rm=TRUE)/n, "\n")
kriegtNA[kriegtNA == 1] <- NA
kriegtNA <- 1 - kriegtNA
# Damit bei * kriegtNA die ursprünglichen Werte erhalten bleiben,
# wird der Vektor "umgedreht".
x[, j] <- kriegtNA * x[, j]
}
}
datsimul[[i]][, -1] <- x
# speichert Variablen mit fehlenden Werten zurück
}
datsimul
}
# Test:
#setwd("Z:/Eigene Dateien/HiWi/HiWi-Code")
#setwd("C:/HiWi-Code")
#source("funktionenZumDGP.R")
#setwd("C:/HiWi-Code/zusatzNA")
#source("funktionenZuMV2class.R")
#d <- dgp1(niter=10, n=1000)
#dNA <- deleteLOG(d)
#****************************************************************************#
# Funktion zum Erzeugen von zufällig fehlenden Werten in Abhängigkeit vom
# Response *deleteDEPy*:
# erzeugt in einer Liste von Datensätzen pro Zufallsvariable _zufällig_ viele
# fehlende Werte in Abhängigkeit vom jeweiligen Response-Wert
deleteDEPy <- function(datsimul, mv = c(1, 0, 1, 1, 0), ...) {
# Eingabe
# datsimul: Liste von gleich großen Datensätzen (z.B. aus einer *dgp*-
# Funktion)
# Funktioniert nur bei Klassifikation!
# mv: Vektor als Indikator für fehlende Werte (missing values); 1 - feh-
# lende Werte einstreuen, 0 - Variable wird voll beobachtet (ohne MVs)
# Ausgabe
# Liste von Datensätzen mit zufällig fehlenden Werten nach MAR2
niter <- length(datsimul) # Anzahl erzeugte Datensätze
nvar <- length(mv) # Anzahl der Variablen x1 - xp
n <- nrow(datsimul[[1]]) # Anzahl Beob eines erzeugten Datensatzes
mv <- mv * n
for (i in 1:niter) {
x <- datsimul[[i]][, -1] # speichert nur die Variablen ab
y <- datsimul[[i]][, 1] # speichert nur den Response ab
for (j in 1:nvar) {
if(mv[j] > 0) {
# streichen nur in den Variablen, die im Vektor mv angegeben sind
p <- rep(0.1, times = n)
# diese Zahl gibt Wahrscheinlichkeit für "1" an, also ist 0.1
# die Wahrscheinlichkeit für kriegtNA == 1, also für NA
if (is.factor(y)) {
p[y == 2] <- 0.3
# diese Zahl gibt Wahrscheinlichkeit für "1" an, also ist
# 0.3 die Wahrscheinlichkeit für kriegtNA == 1, also für NA
}
if (!is.factor(y)) {
p[y < 13] <- 0.4
# diese Zahl gibt Wahrscheinlichkeit für "1" an, also ist
# 0.4 die Wahrscheinlichkeit für kriegtNA == 1, also für NA
}
kriegtNA <- rbinom(n, 1, p)
# n Bernoulli-Experimente, d.h. entweder 0 oder 1 als Ergebnis
cat("Anteil NA in Variable ", j, "Datensatz ", i, sum(kriegtNA)/n, "\n")
kriegtNA[kriegtNA == 1] <- NA
kriegtNA <- 1 - kriegtNA
# Damit bei * kriegtNA die ursprünglichen Werte erhalten bleiben,
# wird der Vektor "umgedreht".
x[, j] <- kriegtNA * x[, j]
}
}
datsimul[[i]][, -1] <- x
# speichert Variablen mit fehlenden Werten zurück
}
datsimul
}
# Test:
#setwd("Z:/Eigene Dateien/HiWi/HiWi-Code")
#setwd("C:/HiWi-Code")
#source("funktionenZumDGP.R")
#setwd("C:/HiWi-Code/zusatzNA")
#source("funktionenZuMV2class.R")
#d <- dgp1(niter=10, n=100)
#dNA <- deleteDEPy(d)
#setwd("C:/HiWi-Code/zusatzNA")
#source("funktionenZuMV2regres.R")
#d <- dgp2(niter=10, n=100)
#dNA <- deleteDEPy(d)
#summary(dNA[[10]])
##############################################################################