Seite 1 von 1

Ausreisserbehandlung mit roling window für Standardabweichung

Verfasst: Di Jul 25, 2017 3:25 pm
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

Re: Ausreisserbehandlung mit roling window für Standardabweichung

Verfasst: Mi Jul 26, 2017 8:29 am
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

Re: Ausreisserbehandlung mit roling window für Standardabweichung

Verfasst: Mi Jul 26, 2017 6:30 pm
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

Re: Ausreisserbehandlung mit roling window für Standardabweichung

Verfasst: Di Aug 01, 2017 5:25 pm
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

Re: Ausreisserbehandlung mit roling window für Standardabweichung

Verfasst: Do Aug 03, 2017 1:41 pm
von jogo
Hier noch ein guter Ratschlag aus den R-fortunes:

Code: Alles auswählen

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

Re: Ausreisserbehandlung mit roling window für Standardabweichung

Verfasst: Di Aug 08, 2017 11:01 am
von daten_tim
:) danke.