aus mehrstufig eine dichotome Var recodieren

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

Moderatoren: EDi, jogo

farngarten
Beiträge: 78
Registriert: Fr Dez 08, 2017 6:42 am

aus mehrstufig eine dichotome Var recodieren

Beitrag von farngarten »

Hallo , wie recodiere ich eine fünfstufige Variable in eine dichotome?
ich habe es einmal probiert, indem ich vorher faktorisiert habe

Code: Alles auswählen

k$v_307 <- factor(k$v_307, levels <- c(1,2,3,4,5), labels <- c( "Single", "Partner", 
                                                                "verheiratet", "geschieden", "verwitwet"))
und dann dies:

Code: Alles auswählen

k$v_307_dicho <- recode(k$v_307, recodes = "Single =  '1' | geschieden  = '1' | verwitwet = '1';  Partner = '2' | verheiratet = '2'")
Dann hab ich es ohne Faktorisierung probiert:

Code: Alles auswählen

k$v_307_dicho <- recode(k$v_307, recodes = "4 = '1' | 5 = '1'; 3 = '2'")
ich hätte gern eine dichotome Variable 1 = die die alleine sind und 2 = die, die nicht allein sind.
Danke für Hilfe




@student, ich hab alternativ den Hinweis von Deiner Webseite probiert.

Code: Alles auswählen

k$v_307_neu <- recode(k$v_307, '"1" = 1 | "4" = 1 | "5" = 1; "2" = 2 | "3" = 2', as.factor = FALSE)
zuvor Datensatz neu geladen ohne v_307 zu faktorisieren.
Fehlermeldung
Error in recode(k$v_307, "\"1\" = 1 | \"4\" = 1 | \"5\" = 1; \"2\" = 2 | \"3\" = 2", :

in recode term: "2" = 2 | "3" = 2
message: Error in 2 | "3" :
operations are possible only for numeric, logical or complex types
>
Zuletzt geändert von farngarten am Do Nov 07, 2019 10:50 am, insgesamt 1-mal geändert.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: aus mehrstufig eine dichotome Var recodieren

Beitrag von bigben »

---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
farngarten
Beiträge: 78
Registriert: Fr Dez 08, 2017 6:42 am

Re: aus mehrstufig eine dichotome Var recodieren

Beitrag von farngarten »

Hallo, danke für den Hinweis.
ich habe den Code so übernommen und mit neuem Inhalt befüllt. aber verstehe nicht alles. insbesondere die zweite Zeile. Ist das korrekt, dass ich schreibe 1:5 wenn meine Variable 5 Ausprägungen hat?

Code: Alles auswählen

 gruppiere <- function(x){
    if(!(x %in% 1:5)){   # sicherheitshalber prüfen, ob valide Eingabe
      warning("Kann keine Gruppen umwandeln, die nicht vorgesehen sind.")
      return(NA)
    }
    if( x==1 | x==4 | x==5){      # Fall : Single, geschieden, verwitwet
      return("allein") 
    }
    return("verpartnert")     # Fall Verheiratet,  verpartnert.
  }
  

Code: Alles auswählen

gruppiere(1)
"allein"
gruppiere(2)
"verpartnert"
gruppiere(3)
"verpartnert"
gruppiere(4)
"allein"
gruppiere(5)
"allein"

gruppiere <- Vectorize(gruppiere)
mit dem print Befehl zeigt er mir auch die Variable als dichotom ( allein - verpartnert) an.

Code: Alles auswählen

print(gruppiere(k$v_307))
dann faktorisiere ich die Variable

Code: Alles auswählen

k$v_307 <- factor(k$v_307)
class(k$v_307)
Wenn ich dann aber die Effektstärke, die diese Variable auf eine Metrische hat, ausrechnen will, gibt es eine fehlermeldung.

Code: Alles auswählen

effsize::cohen.d(k$MKOG_ztr ~ k$v_307, paired = FALSE, na.rm = TRUE)
> effsize::cohen.d(k$MKOG_ztr ~ k$v_307, paired = FALSE, na.rm = TRUE)
Error in cohen.d.default(d, f, ...) : Factor should have only two levels
Was mach ich falsch?
farngarten
Beiträge: 78
Registriert: Fr Dez 08, 2017 6:42 am

Re: aus mehrstufig eine dichotome Var recodieren

Beitrag von farngarten »

@student alternativ bin ich deinem Hinweis gefolgt:

Code: Alles auswählen

k$v_307_neu <- recode(k$v_307, '"1" = 1 | "4" = 1 | "5" = 1; "2" = 2 | "3" = 2', as.factor = FALSE)
zuvor Datensatz neu geladen ohne Variable zu faktorisieren.
Error in recode(k$v_307, "\"1\" = 1 | \"4\" = 1 | \"5\" = 1; \"2\" = 2 | \"3\" = 2", :

in recode term: "2" = 2 | "3" = 2
message: Error in 2 | "3" :
operations are possible only for numeric, logical or complex types
>
die Variable ist aber numerisch.
> class(k$v_307)
[1] "numeric"
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: aus mehrstufig eine dichotome Var recodieren

Beitrag von bigben »

@farngarten Es gibt mindestens drei Pakete, die eine Funktion recode implementieren. car, Hmisc und dplyr. Wir hatten schon besprochen, was Du deshalb immer tun solltest, wenn Du solche Funktionen nutzt.

R stört sich an dem senkrechten Strich |
Schau nochmal genau, wo und wie Student den genutzt hat im Vergleich zu Deinem Code.
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
farngarten
Beiträge: 78
Registriert: Fr Dez 08, 2017 6:42 am

Re: aus mehrstufig eine dichotome Var recodieren

Beitrag von farngarten »

ok , er hat keinen senkrechten Strich benutzt. Student spricht von Faktor-Merkmal. ich habe die Variable faktorisiert.
und nehme den Code von Student. und ich lade nur das Paket car.

Code: Alles auswählen

class(k$v_307)

k$v_307_dicho <- recode(k$v_307, '"1" = 1; "4" = 1; "5" = 1; "2" = 2; "3" = 2', as.factor.result = FALSE)
Ergebnis:
> class(k$v_307)
[1] "factor"
> k$v_307_dicho <- recode(k$v_307, '"1" = 1; "4" = 1; "5" = 1; "2" = 2; "3" = 2', as.factor.result = FALSE)
Error in recode(k$v_307, "\"1\" = 1; \"4\" = 1; \"5\" = 1; \"2\" = 2; \"3\" = 2", :
unused argument (as.factor.result = FALSE)
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: aus mehrstufig eine dichotome Var recodieren

Beitrag von bigben »

R stört sich am Argument "as.factor.result = FALSE"
Schau nochmal genau, wo und wie Student das genutzt hat im Vergleich zu Deinem Code.
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
farngarten
Beiträge: 78
Registriert: Fr Dez 08, 2017 6:42 am

Re: aus mehrstufig eine dichotome Var recodieren

Beitrag von farngarten »

result ist falsch.
Wenn ich es so mache:

Code: Alles auswählen

k$v_307_dicho <- recode(k$v_307, '"1" = 1; "4" = 1; "5" = 1; "2" = 2; "3" = 2', as.factor = FALSE)
k$v_307_dicho
dichotomisiert er das nicht, wie das bei Student auf der Webseite gezeigt wird.

Aber ich habs jetzt, indem ich doppelte und einfache Anführungszeichen vertauscht habe und zudem die einfachen Anführungszeichen um den Zielwert und nicht den Ausgangswert gesetzt habe.

Danke für die Mühe. Ich weiß, dass es nervig ist, aber für Nicht-Informatiker ist es wirklich eine Kathastrophe durch das Gewirr der Paketen und deren unterschiedliche Erfordernisse durchzublicken. Ich bleib dran.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: aus mehrstufig eine dichotome Var recodieren

Beitrag von jogo »

farngarten hat geschrieben: Fr Nov 08, 2019 8:58 am Ich weiß, dass es nervig ist, aber für Nicht-Informatiker ist es wirklich eine Kathastrophe durch das Gewirr der Paketen und deren unterschiedliche Erfordernisse durchzublicken. Ich bleib dran.
klar, die Aufrufkonventionen der Funktionen von verschiedenen Paketen sind nicht einheitlich. Und für manche spezielle Funktionalität benötigt man auch speziell strukturierte Parameter. :shock:
Deshalb ist es auch so ungeheuer wichtig, die Dokumentation zu lesen: :!:

Code: Alles auswählen

help("recode")
und sich die Beispiele vorführen zu lassen: :idea:

Code: Alles auswählen

example("recode")
Wenn die von Dir verwendete Funktion recode() aus dem Paket car ist, dann kann in Deinem Fall der Aufruf noch viel hübscher gestaltet werden (soweit ich das sehe nach dem Lesen der Dokumentation).
Etwa so:

Code: Alles auswählen

set.seed(42)
v307 <- sample(as.character(1:5), 10, repl=TRUE)
data.frame(v307, v307d=car::recode(v307, "c('1', '4', '5')=1; else=2"))
oder

Code: Alles auswählen

data.frame(v307, v307d=car::recode(as.numeric(v307), "2:3=2; else=1"))
Kannst Du bitte trotzdem hier im Forum schreiben, wie Deine Lösung jetzt aussieht?
- Es könnte ja noch für andere wichtig sein.

Gruß, Jörg
p.s.:
... und auch ist es wichtig, die Pakete zu nennen, aus denen man Funktionen verwendet, denn der gleiche Funktionsname kann in verschiedenen Paketen verwendet werden ... und dort eine andere Funktionsdefinition beinhalten.
farngarten
Beiträge: 78
Registriert: Fr Dez 08, 2017 6:42 am

Re: aus mehrstufig eine dichotome Var recodieren

Beitrag von farngarten »

Pakete:

Code: Alles auswählen

library(car)
library(carData)
Hier das Ergebnis:

Code: Alles auswählen

# v_307 ist Familienstand, fünfstufig:  Single - mit Partner - verheiratet - geschieden - verwitwet

class(k$v_307)


# Mache eine neue Variable die dichotomisiert ist,    zusammengefasst werden Singles, verwitwet, geschieden zu 1
# und verpartnert, verheiratet zu 2#
k$v_307_dicho <- recode(k$v_307, "1 = '1'; 4 = '1'; 5 = '1'; 2 = '2'; 3 = '2'")

k$v_307_dicho
class(k$v_307_dicho)

# faktorisiere die neue Variable#
k$v_307_dicho <- factor(k$v_307_dicho) 
class(k$v_307_dicho)

# alternativ kann man faktorisieren mit Labels, die dann in Graphiken Tabllen etc. erscheinen
k$v_307_dicho_label <- factor(k$v_307_dicho, levels <- c(1,2), labels <- c( "allein", "nicht allein"))
k$v_307_dicho_label
sieht gut aus
Antworten