"Matrix" Factors vergleichen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
consuli
Beiträge: 479
Registriert: Mo Okt 10, 2016 8:18 pm

"Matrix" Factors vergleichen

Beitrag von consuli »

Hallo!

Ich bin gerade dabei meine GoF-Maß-Funktion für nominal zu erweitern. Gelgentlich habe ich solche Zielvariablen.

Üblicher Weise mache ich mehrere sich konkurrenzierende Schätzer und fasse deren Prediktions in einer Matrix zusammen, jede Spalte einmal Prediktions. Bei einer nominal skalierten Zielvariable, muss ich also y und yest (hier beide nominal) miteinander vergleichen. Manchmal ist yest ein Vektor (bei einem Schätzer) und manchmal eine Matrix (bei mehreren Schätzern).

Nominale Variablen werden in R üblicher Weise als Factor dargestellt. R Matrizen kennen - aus welchen Gründen auch immer - aber keine R Factors. Die werden in einer Matrize einfach in Ints umgewandelt, so dass ich keinen generalisierten Code für yest als Vektor bzw. Matrix hinbekomme. Und genau hier liegt das Problem.

Wenn ich y nach Int umwandele, funktioniert der Vektor-Matrix vergleich, aber Int-Vektor - Vektor Vergleich funktioniert nicht.

Habe mal versucht es einfach darzustellen. Ich suche einen möglichst eleganten datentypunabhängigen Prozessfluss für folgendes:

Code: Alles auswählen

a= as.factor(c("a","b","c","a","b","c","b","b","b"))
b= as.factor(c("a","b","c","b","b","c","a","c","b"))

# Ok
a == b

# Problem, es entsteht eine Matrix c aus Ints 
c= cbind(a,b)
c == a

# Dirty Workaround
c == as.integer(a)

# Dirty Workaround funktioniert aber nicht wenn c nur ein Vektor ist
c= b
c == as.integer(a)
Irmgard.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: "Matrix" Factors vergleichen

Beitrag von jogo »

Hallo consuli,

IMHO hast Du hier das typische Faktoren-Problem:
Faktoren sind intern integer (Indizes in den Vektor der Levels) und verschiedene Faktoren sind nicht miteinander vergleichbar.
Eine saubere Lösung führt über die Umwandlung in character:

Code: Alles auswählen

a= as.factor(c("a","b","c","a","b","c","b","b","b"))
b= as.factor(c("a","b","c","b","b","c","a","c","b"))

# Ok
a == b
as.character(a) == as.character(b)   # Alternative

# Problem, es entsteht eine Matrix c aus Ints 
c= cbind(a, b)
c= cbind(as.character(a), as.character(b))  # Alternative
c == a
Beim c==a in der letzten Zeile wird a vor dem Vergleich intern zu character umgewandelt.

Gruß, Jörg
consuli
Beiträge: 479
Registriert: Mo Okt 10, 2016 8:18 pm

Re: "Matrix" Factors vergleichen

Beitrag von consuli »

jogo hat geschrieben: Di Apr 18, 2017 8:45 am (...) und verschiedene Faktoren sind nicht miteinander vergleichbar.
Eine saubere Lösung führt über die Umwandlung in character:
Ah ja, irgendwas war da mit den Factors, warum ich die sonst nicht benutze...
Vielen Dank jogo.
Irmgard.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: "Matrix" Factors vergleichen

Beitrag von jogo »

Faktoren sind sehr nützlich in Modellen (man denke an z.B. die Funktion lm()).
Leider haben Faktoren auch einige unschöne Eigenschaften in der Verarbeitung - die Hälfte dieser unschönen Eigenschaften hast Du in Deinem Beispiel abgegrast. Deshalb ist es immer wichtig zu schauen, ob etwas, was wie eine Zeichenkette aussieht, nicht doch ein Faktor ist.
Bei jeglicher Entstehung von Dataframes ist stringsAsFactors=TRUE als Standard (außer man hat den Standardwert umgesetzt, siehe default.stringsAsFactors()) - dies gilt auch für read.table() und Verwandte.
Dieses Standardverhalten hat schon viel Leid über Scharen von R-usern gebracht hat - vielleicht haben es die Autoren von data.table u.a. deshalb in ihrem Paket anders gemacht.

Gruß, Jörg
Antworten