Seite 1 von 1

Kodieren mehrerer richtiger Antworten mit if-Schleife

Verfasst: Fr Jul 07, 2023 12:26 pm
von Zwänni
Hallo,
ich möchte gerne eine sequentielle Bepunktung ( 1 = richtig, 0= falsch) von Testitems mit vier Antwortkategorien (1:4) vornehmen und habe dafür bereits dieses hervorragende Tutorial gefunden: https://m-py.github.io/TesttheorieR/sch ... -testitems. Es scheitert allerdings an der Anwendung auf meinen Datensatz, da für einige Items zwei Antworten korrekt sind (in der Variable bt_keys gerade mit | gekennzeichnet, z.b. ist für BT_1 ist die Antwort 3 richtig, für BT_3 sind Antworten 1 und 2 richtig). Wie kann man das umsetzen?

Vielen Dank für die Hilfe

Beispielcode (mit dem | operator funktioniert es NICHT):

Code: Alles auswählen



## Load libraries

library(readxl)
library(openxlsx) 
library(dplyr)
library(knitr)
library(data.table)
library(readr)

## read data
tonegen_clean <- read_xlsx("tonegen_clean.xlsx")

# correct keys for tone generation task

# Pretest

bt_keys <- c(
3,	  3,	 # BT_1, BT_2
1|2,	1|2, # BT_3, BT_4
3|4,	3|4, # BT_5, BT_6
2|4,  2|4, # BT_7, BT_8
3,	  3,   # BT_9, BT_10
1|2,  1|2, # BT_11, BT_12
3|4,	3|4, # BT_13, BT_14
1|2,	1|2, # BT_15, BT_16
2|4,  2|4, # BT_17, BT_18
1, 1, 1)   # BT_19, BT_20, BT_21

# FOR loops for coding correct answers:

  # Pretest
for (i in 1:21) {
    # 1. choose column-name of i-th item:
    colnamebt <- paste0("BT_", i)
    # 2. choose response:
    ith_itembt <- tonegen_clean[[colnamebt]]
    # 3. recode:
    bt_response <- ifelse (ith_itembt == bt_keys[i], 1, 0) 
    # 4. name the new columns:
    new_colnamebt  <- paste0(colnamebt, "_cod")
     # 5. add coded values to data.frame an:
    tonegen_clean[[new_colnamebt]] <- bt_response}
tonegen_clean.xlsx
(61.19 KiB) 314-mal heruntergeladen

Re: Kodieren mehrerer richtiger Antworten mit if-Schleife

Verfasst: Fr Jul 07, 2023 6:52 pm
von Athomas
Dieses Skript wurde als Begleitmaterial für eine Lehrveranstaltung konzipiert.
Hmm, hmm, hmm. Hast Du denn an dieser Lehrveranstaltung teilgenommen - oder hast Du Dir das gespart und bist direkt in die Äkschen eingestiegen :lol: ?

Re: Kodieren mehrerer richtiger Antworten mit if-Schleife

Verfasst: Sa Jul 08, 2023 11:20 am
von Athomas
Ich habe etwas gefrickelt, was sich an Deinen Vorstellungen orientiert, allerdings keine „for loops“ enthält, sondern das Ganze eher R-mäßig angeht.

Aus Deiner Beschreibung ist nicht ersichtlich, welche Bedeutung die „a-Variablen“ (etwa „BT_8a“) haben - Du lieferst ja hoffentlich nichts mit, was für Deine Frage bedeutungslos ist!?

Auch habe ich mich an Deinem Ansatz zur Vorgabe der richtigen Antworten orientiert (Stichwort „list column“), das ist aber sicher nicht der einfachste (und natürliche) Weg – der wäre meiner Meinung nach, alle „richtigen“ Kombinationen von Fragen-Nr. und Antwort (untereinander) aufzuzählen und die (ins „lange“ Format gebrachten) erfolgten Antworten damit abzugleichen…

Code: Alles auswählen

library(openxlsx) 
library(data.table)

Antworten <- data.table(read.xlsx("http://forum.r-statistik.de/download/file.php?id=1851"))
Antworten[  , X1:=NULL]

Antworten.long <- melt(Antworten, id="CASE", variable.factor=FALSE)

Testnummer <- function(Text) as.integer(gsub("a", "", gsub("BT_", "", Text)))
Typ        <- function(Text) ifelse(grepl("a", Text), "Zusatz", "Antwort")

Antworten.long[  , ":="(TstNr=Testnummer(variable), TYP=Typ(variable))]
Antworten.long[  , variable:=NULL]

Antworten.semi <- dcast(Antworten.long, CASE + TstNr ~ TYP)
setkey(Antworten.semi, TstNr)
#-------------------------------------------------------------------------------

Richtig <- data.table(richtig=list(3, 3, c(1,2), c(1,2), c(3,4), c(3,4), c(2,4), 
                                   c(2,4), 3, 3, c(1,2), c(1,2), c(3,4), c(3,4), 
                                   c(1,2), c(1,2), c(2,4), c(2,4), 1, 1, 1))
Richtig[  , TstNr:=1:.N]
setkey(Richtig, TstNr)

Auswertung <- Richtig[Antworten.semi]

Auswertung[  , korrekte.Antwort:=mapply(Antwort, richtig, FUN="%in%")]

PunkteProKandidat <- Auswertung[  , .(Summe=sum(korrekte.Antwort)), by=CASE]
max(PunkteProKandidat$Summe)