Seite 1 von 2

aus mehrstufig eine dichotome Var recodieren

Verfasst: Mi Nov 06, 2019 9:33 pm
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
>

Re: aus mehrstufig eine dichotome Var recodieren

Verfasst: Mi Nov 06, 2019 9:47 pm
von bigben

Re: aus mehrstufig eine dichotome Var recodieren

Verfasst: Do Nov 07, 2019 10:39 am
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?

Re: aus mehrstufig eine dichotome Var recodieren

Verfasst: Do Nov 07, 2019 10:55 am
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"

Re: aus mehrstufig eine dichotome Var recodieren

Verfasst: Do Nov 07, 2019 8:37 pm
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.

Re: aus mehrstufig eine dichotome Var recodieren

Verfasst: Do Nov 07, 2019 9:34 pm
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)

Re: aus mehrstufig eine dichotome Var recodieren

Verfasst: Do Nov 07, 2019 9:41 pm
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.

Re: aus mehrstufig eine dichotome Var recodieren

Verfasst: Fr Nov 08, 2019 8:58 am
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.

Re: aus mehrstufig eine dichotome Var recodieren

Verfasst: Fr Nov 08, 2019 9:57 am
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.

Re: aus mehrstufig eine dichotome Var recodieren

Verfasst: Fr Nov 08, 2019 8:12 pm
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