Ausreisserbehandlung mit roling window für Standardabweichung

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
daten_tim

Ausreisserbehandlung mit roling window für Standardabweichung

Beitrag von daten_tim »

Liebes Forum,
ich kümmere mich gerade um meine Ausreißer. Durch einen einfacheren Befehl, habe ich schon Ausreißer durch einen threshold-Wert ersetzt, die sehr tief oder sehr hoch liegen. Das funktioniert aber nicht bei allen Ausreißern. Diese Ausreißer würde ich gerne erkennen und ersetzen. Aber wie? Ich dachte an ein Verfahren, welches einen Wert ersetzt, wenn dieser ein Vielfaches der Standardabweichung aus Vorwert(en) und Nachwert(en) ist, z.B. drei mal so hoch. Ersetzt werden könnte der Wert dann z.B. mit dem Mittelwert aus Vorwert(en) und Nachwert(en). Aber beim Coding komme ich nicht richtig vorwärts. Anbei einmal mein Versuch, aber der funktioniert nicht richtig:

Code: Alles auswählen

m <- matrix(c(1,2,3,4,5,6,7,8,9,8,2,3,4,5,6,7,8,9,1,7,3,4,5,6,7,8,9,1,2,3,4,5,6,1,8,9), ncol=4)
m

# hier funktioniert das noch nicht richtig

for(i in 1:ncol(m)){
   if(m[,i] < 3*rollapply(m[,i], width = 5, FUN = sd, fill = NA)[,i])
  # if(m[,i] > 3*rollapply(m[,i], width = 5, FUN = sd, fill = NA)[,i])
    {
     
  m[,i] <- rollapply(m[j,i], width = 5, FUN = sd, fill = NA)[,i] 
 
};};
Ich freue mich sehr über Eure Hilfe.
tim
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Ausreisserbehandlung mit roling window für Standardabweichung

Beitrag von jogo »

Hallo Tim,

es wäre schön, wenn Du den Algorithmus an einem Vektor als Beispiel beschreibst und auch das gewünschte Ergebnis angibst (dies dient auch der Spezifizierung, was denn wie nun genau "aber der funktioniert nicht richtig").

Gruß, Jörg
daten_tim

Re: Ausreisserbehandlung mit roling window für Standardabweichung

Beitrag von daten_tim »

Hallo Jörg,
das macht Sinn. Ich versuche mich noch einmal verständlicher auszudrücken und auch was richtigzustellen. In meiner Matrix m sind in der zweiten, dritten und vierten Spalte Ausreißer: in [1,2]; [2,3] und [7,4]. Mit dem Befehl rollapply(m, width = 3, FUN = sd, fill = NA) (rollapply {zoo}) werden für die Matrix m Standardabweichungen berechnet. Die wollte ich als Indikator nutzen, ob es sich bei einem Wert wirklich um einen Ausreißer handelt - das war die Idee. Jetzt denke ich, dass das eventuell gar nicht mehr so eine gute Idee ist. So zeigt schon mein Beispiel, dass ich aus den Standardabweichungen gar nicht gut erkennen kann, welcher Wert denn nun der Ausreißer ist. Obwohl [7,4] der Ausreisser ist, ist [8,4] die größte Standardabweichung.

Code: Alles auswählen

> rollapply(m, width = 3, FUN = sd, fill = NA)
      [,1]    [,2]     [,3]     [,4]
 [1,]   NA      NA       NA       NA
 [2,]    1 3.21455 3.055050 1.000000
 [3,]    1 1.00000 2.081666 1.000000
 [4,]    1 1.00000 1.000000 1.000000
 [5,]    1 1.00000 1.000000 1.000000
 [6,]    1 1.00000 1.000000 2.645751
 [7,]    1 1.00000 1.000000 3.605551
 [8,]    1 1.00000 1.000000 4.358899
 [9,]   NA      NA       NA       NA
Deshalb denke ich nun, eventuell die Differenzen zu untersuchen, also zu schauen, wie hoch die Differenz zum Vorwert ist. Folgendes funktioniert dabei für den zweiten Ausreisser:

Code: Alles auswählen

if(m[2,3] > 1.5*m[2-1,3])
  m[2,3] = mean(m[2-1,3]:m[2+1,3])
Für eine Schleife, die ich so aufstellen wollte, funktioniert das noch nicht:

Code: Alles auswählen

for(i in 1:nrow(m)){
  if(m[i,] < 0.5*m[i-1,] | m[i,] > 1.5*m[i-1,])
   {
        m[i,] <- mean(m[i-1,]:m[i+1,]);
      };};
Das hat wahrscheinlich auch damit zu tun, dass es nicht immer einen m[i+1,] gibt, z.B. wenn i=9.
Das stecke ich zur Zeit fest. Ich freue mich über Ideen.

tim
daten_tim

Re: Ausreisserbehandlung mit roling window für Standardabweichung

Beitrag von daten_tim »

hallo forum,
nur für das protokoll. es geht jetzt zwar erst einmal nicht mehr um standardabweichung, sondern um differenzen, aber jetzt macht die schleife endlich das, was ich wollte: die ausreisser werden ersetzt, und zwar durch den mittelwert von vor- und nachwert.

Code: Alles auswählen

m <- matrix(c(1,2,3,4,5,6,7,8,9,1,2,3,8,5,6,7,8,9,1,7,3,4,5,6,7,8,9,1,2,3,4,5,6,1,8,9,90,91,92,93,200,95,96,97,98), ncol=5)
m

m2 = m[-c(1,9),]
m2


for(j in 1:ncol(m2)){
  for(i in 1:nrow(m2)){
 
  if( m2[i,j] < 0.5*m[i,j] | m2[i,j] > 1.5*m[i,j] )
    {
        m2[i,j] <- mean(m[i,j] : m[i+2,j]); 
        m[i+1,j] = m2[i,j]; 
        
        };};};
m
m2
beste gruesse
tim
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Ausreisserbehandlung mit roling window für Standardabweichung

Beitrag von jogo »

Hier noch ein guter Ratschlag aus den R-fortunes:

Code: Alles auswählen

library("fortunes")
fortune(71)
SCNR, Jörg
Antworten