Fehlermeldung "NAs introduced by coercion"

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

Moderatoren: EDi, jogo

Antworten
sabrina5678
Beiträge: 10
Registriert: Mi Mär 04, 2020 4:11 pm

Fehlermeldung "NAs introduced by coercion"

Beitrag von sabrina5678 »

Hallo!

Ich benutze diesen Datensatz:
https://www.dropbox.com/s/qeciwezjg6pfx ... r.sav?dl=0

mit folgenden Paketen:

Code: Alles auswählen

library(car); library(ggplot2); library(haven); library(lavaan); library(psych); library(pwr)
Wenn ich nun einen Datensatz erstellen möchte, kommt diese Fehlermeldung:
"NAs introduced by coercionError: Can't use numeric NA as column index with `[`."

Code: Alles auswählen

d <- data.frame(
  female = d_raw$d10 - 1, 
  sex = factor(d_raw$d10, labels = c("male", "female")), 
  age = d_raw$d11,
  iNet_info <- recode(d_raw$qc10, "7='iNet'; 6='sozNet'; c(1,2,3,4,5,8,9,10,11)='sonst'"),
  impf_einst = rowMeans(d_raw[vars_impf_einst], na.rm = TRUE),
  Impf_zuv = recode(d_raw$qc2, "1=5; 2=4; 3=3; 4=2; 5=1; 6=NA")
)
Die eingespeisten Variablen habe ich davor wie folgt definiert:

Code: Alles auswählen

# Speichern der Ausgangsdaten als "d_raw"
d_raw <- read_spss("eurobarometer.sav")

#Impfeinstellung definieren: (5 als fehlender Wert behandeln, da dieser die Ausprägung "Don't know"hat): 
d_raw$qc8_1[d_raw$qc8_1==5]<-NA
d_raw$qc8_2[d_raw$qc8_2==5]<-NA
d_raw$qc8_3[d_raw$qc8_3==5]<-NA
d_raw$qc8_4[d_raw$qc8_4==5]<-NA
d_raw$qc8_5[d_raw$qc8_5==5]<-NA

vars_impf_einst <- c(d_raw$qc8_1, d_raw$qc8_2, d_raw$qc8_3, d_raw$qc8_4, d_raw$qc8_5) 

#Internet und Social Media als vertrauenswürdigste Inmpf-Informationsquellen definieren:

iNet_info <- recode(d_raw$qc10, "7='iNet'; 6='sozNet'; c(1,2,3,4,5,8,9,10,11)='sonst'")


#Erwartung der Impf-Zuverlässigkeit (5 und 6 als fehlenden Wert behandeln)

d_raw$qc2[d_raw$qc2==6]<-NA 
d_raw$qc2[d_raw$qc2==5]<-NA

Impf_zuv <- car::recode(d_raw$qc2, "1=4; 2=3; 3=2; 4=1; 5=NA; 6=NA") 

Hat jemand eine Idee, was ich ändern muss, um die Fehlermeldung wegzubekommen?

Vielen Dank im Voraus!
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fehlermeldung "NAs introduced by coercion"

Beitrag von jogo »

Hallo Sabrina,

auf die Schnelle würde ich sagen, es sollte

Code: Alles auswählen

vars_impf_einst <- c("qc8_1", "qc8_2", "qc8_3", "qc8_4", "qc8_5")
heißen.

Übrigens bekomme ich bei Deinem ursprünglichen Code den Fehler:

Code: Alles auswählen

Fehler: Can't use numeric NA as column index with `[`.
Call `rlang::last_error()` to see a backtrace
Da ist noch ein Fehler, es muss heißen:

Code: Alles auswählen

  iNet_info = recode(d_raw$qc10, "7='iNet'; 6='sozNet'; c(1,2,3,4,5,8,9,10,11)='sonst'"),

Wenn Du die haven_labelled-Objekte loswerden willst, empfehle ich:

Code: Alles auswählen

d <- data.frame(
  female = as.numeric(d_raw$d10) - 1, 
  sex = factor(d_raw$d10, labels = c("male", "female")), 
  age = as.numeric(d_raw$d11),
  iNet_info = recode(as.numeric(d_raw$qc10), "7='iNet'; 6='sozNet'; else='sonst'"),
  impf_einst = rowMeans(d_raw[vars_impf_einst], na.rm = TRUE),
  Impf_zuv = recode(as.numeric(d_raw$qc2), "1=5; 2=4; 3=3; 4=2; 5=1; 6=NA")
)
Vielleicht gefällt Dir bei $female ein logic:

Code: Alles auswählen

  female = as.numeric(d_raw$d10) == 2, 
Du behandelst $qc2 zweimal, einmal im originalen Dataframe:

Code: Alles auswählen

#Erwartung der Impf-Zuverlässigkeit (5 und 6 als fehlenden Wert behandeln)
d_raw$qc2[d_raw$qc2==6]<-NA 
d_raw$qc2[d_raw$qc2==5]<-NA
und einmal bei der Erstellung des neuen Dataframes. Auch generierst Du das Objekt Impf_zuv auch nochmal außerhalb des neuen Dataframes.

Bei mir sieht es derzeit so aus:

Code: Alles auswählen

library(haven); library(car); 
# library(ggplot2); library(lavaan); library(psych); library(pwr)

# Speichern der Ausgangsdaten als "d_raw"
d_raw <- read_spss("eurobarometer.sav")

#Impfeinstellung definieren: (5 als fehlender Wert behandeln, da dieser die Ausprägung "Don't know"hat): 
vars_impf_einst <- paste0("qc8_", 1:5)
is.na(d_raw[, vars_impf_einst]) <- as.matrix(d_raw[, vars_impf_einst])==5

d <- data.frame(
  female = as.numeric(d_raw$d10) == 2, 
  sex = factor(d_raw$d10, labels = c("male", "female")), 
  age = as.numeric(d_raw$d11),
  iNet_info = recode(as.numeric(d_raw$qc10), "7='iNet'; 6='sozNet'; else='sonst'"),
  impf_einst = rowMeans(d_raw[vars_impf_einst], na.rm = TRUE),
  Impf_zuv = recode(as.numeric(d_raw$qc2), "1=5; 2=4; 3=3; 4=2; 5=1; 6=NA")
)
Gruß, Jörg
sabrina5678
Beiträge: 10
Registriert: Mi Mär 04, 2020 4:11 pm

Re: Fehlermeldung "NAs introduced by coercion"

Beitrag von sabrina5678 »

Hey Jörg,

danke für deine Hilfe.

Wenn ich folgenden/deinen data.frame erstellen möchte

Code: Alles auswählen

library(haven); library(car); 
# library(ggplot2); library(lavaan); library(psych); library(pwr)

# Speichern der Ausgangsdaten als "d_raw"
d_raw <- read_spss("eurobarometer.sav")

#Impfeinstellung definieren: (5 als fehlender Wert behandeln, da dieser die Ausprägung "Don't know"hat): 
vars_impf_einst <- paste0("qc8_", 1:5)
is.na(d_raw[, vars_impf_einst]) <- as.matrix(d_raw[, vars_impf_einst])==5

d <- data.frame(
  female = as.numeric(d_raw$d10) == 2, 
  sex = factor(d_raw$d10, labels = c("male", "female")), 
  age = as.numeric(d_raw$d11),
  iNet_info = recode(as.numeric(d_raw$qc10), "7='iNet'; 6='sozNet'; else='sonst'"),
  impf_einst = rowMeans(d_raw[vars_impf_einst], na.rm = TRUE),
  Impf_zuv = recode(as.numeric(d_raw$qc2), "1=5; 2=4; 3=3; 4=2; 5=1; 6=NA")
)

erhalte ich jedoch immernoch die Fehlermeldung "NAs introduced by coercion". Kann ich diese dann einfach ignorieren, bzw. erhälst du diese Fehlermeldung nicht?

Die Ausprägungen der Variable vars_impf_einst sollte ich zusätzlich noch rekodieren, also 1=4; 2=3; 3=2; 4=1, und 5 wie gehabt als fehlenden Wert.
An welcher Stelle füge ich denn dann die Rekodierung am besten ein? Ich nehme an, erst bei der Erstellung des data.frame ? Wenn ja, einfach nach dem Befehl na.rm=True?
Also praktisch so?:

Code: Alles auswählen

d <- data.frame(
  female = as.numeric(d_raw$d10) == 2, 
  sex = factor(d_raw$d10, labels = c("male", "female")), 
  age = as.numeric(d_raw$d11),
  iNet_info = recode(as.numeric(d_raw$qc10), "7='iNet'; 6='sozNet'; else='sonst'"),
  impf_einst = rowMeans(d_raw[vars_impf_einst], na.rm = TRUE, "1=4; 2=3; 3=2; 4=1"),
  Impf_zuv = recode(as.numeric(d_raw$qc2), "1=5; 2=4; 3=3; 4=2; 5=1; 6=NA")
)
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fehlermeldung "NAs introduced by coercion"

Beitrag von jogo »

Hallo Sabrina,
sabrina5678 hat geschrieben: Mi Mär 11, 2020 12:44 pm Wenn ich folgenden/deinen data.frame erstellen möchte

Code: Alles auswählen

library(haven); library(car); 
# library(ggplot2); library(lavaan); library(psych); library(pwr)

# Speichern der Ausgangsdaten als "d_raw"
d_raw <- read_spss("eurobarometer.sav")

#Impfeinstellung definieren: (5 als fehlender Wert behandeln, da dieser die Ausprägung "Don't know"hat): 
vars_impf_einst <- paste0("qc8_", 1:5)
is.na(d_raw[, vars_impf_einst]) <- as.matrix(d_raw[, vars_impf_einst])==5

d <- data.frame(
  female = as.numeric(d_raw$d10) == 2, 
  sex = factor(d_raw$d10, labels = c("male", "female")), 
  age = as.numeric(d_raw$d11),
  iNet_info = recode(as.numeric(d_raw$qc10), "7='iNet'; 6='sozNet'; else='sonst'"),
  impf_einst = rowMeans(d_raw[vars_impf_einst], na.rm = TRUE),
  Impf_zuv = recode(as.numeric(d_raw$qc2), "1=5; 2=4; 3=3; 4=2; 5=1; 6=NA")
)

erhalte ich jedoch immernoch die Fehlermeldung "NAs introduced by coercion". Kann ich diese dann einfach ignorieren, bzw. erhälst du diese Fehlermeldung nicht?
richtig, ich erhalte die Fehlermeldung nicht.
Fehlermeldungen dieser Art sind durchaus beachtenswert.

Ist denn die Datei, die Du einliest identisch mit der, die Du in die Dropbox gestellt hast?

Gruß, Jörg
sabrina5678
Beiträge: 10
Registriert: Mi Mär 04, 2020 4:11 pm

Re: Fehlermeldung "NAs introduced by coercion"

Beitrag von sabrina5678 »

Hey Jörg,

ja, das ist der identische Datensatz.
Mir ist aufgefallen, dass die Fehlermeldung immer nur in einem R-Markdown Dokument erscheint. Wenn ich den dataframe in einem R-Skript erstelle, erhalte ich auch keine Fehlermeldung.
Da ich das Dokument abschließend jedoch knittn muss, muss ich ein R-Markdown Dokument benutzen..

Kann dies denn möglich sein, dass es an dem R-Markdown liegt mit der Fehlermeldung?

Lg
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fehlermeldung "NAs introduced by coercion"

Beitrag von jogo »

Hallo Sabrina,

es gibt zumindest Umstände, die dazu führen, dass beim Stricken die Umgebung etwas anders aussieht als beim Abarbeiten des R-Skriptes.
https://stackoverflow.com/search?q=%5Br ... n+knitting

Gruß, Jörg
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Fehlermeldung "NAs introduced by coercion"

Beitrag von bigben »

Hi!
sabrina5678 hat geschrieben: Mi Mär 11, 2020 1:46 pmKann dies denn möglich sein, dass es an dem R-Markdown liegt mit der Fehlermeldung?
Würde es denn sehr weh tun, Jörgs Code außerhalb von Markdown in der Console auszuprobieren? Das würde die Frage doch schneller beantworten als ein Post hier.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fehlermeldung "NAs introduced by coercion"

Beitrag von jogo »

Hallo Bernhard,

soweit ich die vorherige Nachricht von Sabrina verstanden habe, hat sie das getan.
"Wenn ich den dataframe in einem R-Skript erstelle, erhalte ich auch keine Fehlermeldung."

Gruß, Jörg
sabrina5678
Beiträge: 10
Registriert: Mi Mär 04, 2020 4:11 pm

Re: Fehlermeldung "NAs introduced by coercion"

Beitrag von sabrina5678 »

Hallo zusammen,

wie Jörg es richtig verstanden hat, habe ich dies bereits ausprobiert.
Die Fehlermeldung erscheint bei mir jedoch sofort im R-Markdown und nicht erst beim knitten des Dokuments (wie es der Link thematisiert von dir Jörg).

Was es auf sich hat mit der Fehlermeldung im R-Markdown und ich anders machen sollte, bekomme ich folglich leider nicht raus -.-
Für jegliche Ideen und Tipps, wäre ich daher sehr dankbar!


Lg
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fehlermeldung "NAs introduced by coercion"

Beitrag von jogo »

Hallo Sabrina,

da wir diesen Fehler nicht reproduzieren können, ist es unmöglich dezidierte Hinweise zu geben.
Mein Vorgehen in so einer Situation wäre:
- Versionsnummern von RStudio (und eventuell auch von R) überprüfen, ggf. aktualisieren
- Code-chunks soweit reduzieren/eleminieren, um das Problem einzugrenzen
- Code-chunks, die Diagnoseinfo liefern, einbauen. getwd(); sessionInfo()
- frisches RMarkdown-Dokument aufsetzen bis zum ersten Code-chunk, ...

Gruß, Jörg
Antworten