2016-04-04 5 views
2

Ich gehe zu winsorize mein Datensatz, um einige Ausreißer mit dem Paket robustHD loszuwerden. Es ist das erste Mal, dass ich auf diesen Fehler stieß. Der Datensatz enthält mehr als 50 Variablen und mehr als 100 Beobachtungen."System ist rechnerisch singular" Fehler, wenn ich 'Winsorize'

Wie kann ich das beheben? Und warum Matrix-Singularität für eine Berechnung wie winsorize wichtig ist? Vielen Dank.

df_win<-winsorize(df,prob=0.95) 
Error in solve.default(R) : system is computationally singular: reciprocal condition number = 1.26103e-18 
+1

Hallo, willkommen zu StackOverflow. Es wäre sehr hilfreich, wenn das Beispiel reproduzierbar wäre. Können Sie einen minimalen Datensatz bereitstellen, der diesen Fehler repliziert? Kannst du auch notieren, von welchem ​​Paket du die 'winsorize' Funktion bekommen hast? Mehrere Pakete bieten eins. – Laterow

+0

@Laterow Danke! Ich habe das Paket 'robustHD' benutzt. Leider kann ich die Daten nicht hochladen, da sie mit der Arbeit zu tun hat ... –

Antwort

2

Der Grund dafür ist, dass winsorize in robustHDsolve verwendet. Wenn Sie sich den Code genauer ansehen, ruft winsorize in einem Datenrahmen die Methode winsorize.data.frame auf, bei der es sich einfach um ein Skript handelt, das as.matrix ausführt und dann die Methode winsorize.matrix verwendet. Dies macht eine Reihe von Dingen, aber das Problem ist hier, dass es die solve Funktion verwendet.

Der Fehler, den Sie erhalten, ist von solve. Der Fehler tritt wahrscheinlich auf, weil Sie einige Variablen/Spalten enthalten, die sehr stark korreliert sind, oder vielmehr lineare Kombinationen von einander sind. Sie sollten überprüfen, ob Sie doppelte Variablen oder Variablen haben, die sich gegenseitig transformieren.

Es gibt mehrere Dinge, die Sie tun können:

  1. Entfernen Sie eine der stark korrelierten Variablen und versuchen Sie es erneut.
  2. Überprüfen Sie ein anderes Paket zu verwenden winsorize von.
  3. Schreiben Sie Ihre eigene Winsorize-Funktion.

Der schnellste Weg, um den zweiten Schritt zu tun:

require(sos) 
findFn("winsorize") 

Dies wird eine Übersicht über alle Funktionen erzeugt, die das Wort „winsorize“ in ihrer Beschreibung. Suchen Sie einfach nach Funktionen, die für die Winsorisierung beschrieben werden.

+0

Danke @Laterow. Ich hab es verstanden. Das FindFn ist auch sehr nützlich. Danke vielmals! –