Hier ist der Test, an dem ich interessiert bin: http://www.itl.nist.gov/div898/handbook/eda/section3/eda35h3.htm
Wie kann ich diesen Code in eine Funktion umwandeln, die einen Vektor numerischer Werte akzeptiert und einen logischen Vektor zurückgibt, der angibt, welche Datenpunkte entfernt werden sollen?
Ich habe unten versucht, dies zu tun, aber ich komme nicht weiter, weil sich die sortierte Vektor zum Zurückgeben nicht mit den Eingabedaten des Vektors deckt.
# Eingabedaten
y = c(-0.25, 0.68, 0.94, 1.15, 1.20, 1.26, 1.26,
1.34, 1.38, 1.43, 1.49, 1.49, 1.55, 1.56,
1.58, 1.65, 1.69, 1.70, 1.76, 1.77, 1.81,
1.91, 1.94, 1.96, 1.99, 2.06, 2.09, 2.10,
2.14, 2.15, 2.23, 2.24, 2.26, 2.35, 2.37,
2.40, 2.47, 2.54, 2.62, 2.64, 2.90, 2.92,
2.92, 2.93, 3.21, 3.26, 3.30, 3.59, 3.68,
4.30, 4.64, 5.34, 5.42, 6.01)
## Normalverteilungsdiagramm generieren.
qqnorm(y)
removeoutliers = function(dfinputcol) {
y = as.vector(dfinputcol)
## Funktion zum Berechnen der Teststatistik erstellen.
rval = function(y){
ares = abs(y - mean(y))/sd(y)
df = data.frame(y, ares)
r = max(df$ares)
list(r, df)}
## Werte und Vektoren definieren.
n = length(y)
alpha = 0.05
lam = c(1:10)
R = c(1:10)
## Teststatistik berechnen, bis r=10 Werte aus der Stichprobe entfernt wurden.
for (i in 1:10){
if(i==1){
rt = rval(y)
R[i] = unlist(rt[1])
df = data.frame(rt[2])
newdf = df[df$ares!=max(df$ares),]}
else if(i!=1){
rt = rval(newdf$y)
R[i] = unlist(rt[1])
df = data.frame(rt[2])
newdf = df[df$ares!=max(df$ares),]}
## Kritischen Wert berechnen.
p = 1 - alpha/(2*(n-i+1))
t = qt(p,(n-i-1))
lam[i] = t*(n-i) / sqrt((n-i-1+t**2)*(n-i+1))
}
## Ergebnisse ausgeben.
newdf = data.frame(c(1:10),R,lam)
names(newdf)=c("Ausreißer","Teststatistik", "Kritischer Wert")
# Festlegen, wie viele Ausreißer entfernt werden sollen
toremove = max(newdf$Ausreißer[newdf$Teststatistik > newdf$Kritischer Wert])
# Vektor gleicher Größe wie Eingabevektor erstellen
logischerVektorWennsollentferntwerden = logical(length=length(y))
# aber wie bestimmt man, welche Ausreißer entfernt werden sollen?
# die größten Datenpunkte als Ausreißer zum Entfernen festlegen... können jedoch in einigen Datensätzen die kleinsten sein..
logischerVektorWennsollentferntwerden = replace(logischerVektorWennsollentferntwerden, tail(sort(y), toremove), TRUE)
return (logischerVektorWennsollentferntwerden)
}
# dies sollte 3 Datenpunkte auf TRUE gesetzt haben.. hat aber nur 2 und das sind nicht die richtigen
output = removeoutliers(y)
length(output[output==T])