Beschreibung
Bei der numerischen Übereinstimmung (NUMERIC_MATCH) werden leere Antwortwerte bzw. null aktuell wie der Zahlenwert 0 behandelt. Dadurch kann eine Regel NUMERIC_MATCH = 0 auch dann als richtig bewertet werden, wenn ein Eingabefeld leer geblieben ist.
Das fällt besonders auf, wenn bei Basisvariablen die Processing-Optionen TAKE_DISPLAYED_AS_VALUE_CHANGED und TAKE_EMPTY_AS_VALID gesetzt sind, damit abgeleitete Variablen auch bei fehlenden Werten ausgewertet werden können.
Reproduktion
Minimaler Fall mit @iqb/responses 5.1.0:
const { CodingSchemeFactory } = require('@iqb/responses');
const variableCodings = [{
id: 'gap1',
alias: 'gap1',
sourceType: 'BASE',
sourceParameters: {
processing: ['TAKE_DISPLAYED_AS_VALUE_CHANGED', 'TAKE_EMPTY_AS_VALID']
},
processing: [],
fragmenting: '',
codeModel: 'RULES_ONLY',
codes: [{
id: 1,
score: 1,
ruleSets: [{
rules: [{ method: 'NUMERIC_MATCH', parameters: ['0'] }]
}]
}, {
id: 0,
score: 0,
type: 'RESIDUAL_AUTO'
}]
}];
CodingSchemeFactory.code([
{ id: 'gap1', value: '', status: 'DISPLAYED' }
], variableCodings);
Aktuelles Verhalten
Der leere Wert wird als CODING_COMPLETE mit code: 1 / score: 1 bewertet. Dasselbe passiert mit value: null und status: 'VALUE_CHANGED'.
Ursache ist, dass getValueAsNumber(null) und getValueAsNumber('') derzeit 0 zurückgeben und NUMERIC_MATCH nicht vorher auf null/leer prüft.
Erwartetes Verhalten
NUMERIC_MATCH = 0 sollte nur tatsächliche numerische Nullwerte treffen, z. B. 0, '0', '00', '0,0', aber nicht null oder leere Strings.
Leere bzw. technische Nullwerte sollten stattdessen explizit über IS_EMPTY bzw. IS_NULL kodiert werden können.
Workaround
Bis zur Korrektur können vor der NUMERIC_MATCH = 0-Regel eigene Codes für IS_EMPTY und ggf. IS_NULL mit 0 Punkten angelegt werden. Da Codes in Reihenfolge geprüft werden, fangen diese Regeln leere/null-Werte ab, bevor die numerische 0-Regel greift.
Hinweis
Eine Änderung kann bestehende Kodierschemata beeinflussen, falls diese bisher implizit darauf beruhen, dass leer/null als numerische 0 zählt. Daher sollte der Fix vermutlich mit Release-Hinweis bzw. Migrationsempfehlung erfolgen.
Beschreibung
Bei der numerischen Übereinstimmung (
NUMERIC_MATCH) werden leere Antwortwerte bzw.nullaktuell wie der Zahlenwert0behandelt. Dadurch kann eine RegelNUMERIC_MATCH = 0auch dann als richtig bewertet werden, wenn ein Eingabefeld leer geblieben ist.Das fällt besonders auf, wenn bei Basisvariablen die Processing-Optionen
TAKE_DISPLAYED_AS_VALUE_CHANGEDundTAKE_EMPTY_AS_VALIDgesetzt sind, damit abgeleitete Variablen auch bei fehlenden Werten ausgewertet werden können.Reproduktion
Minimaler Fall mit
@iqb/responses5.1.0:Aktuelles Verhalten
Der leere Wert wird als
CODING_COMPLETEmitcode: 1/score: 1bewertet. Dasselbe passiert mitvalue: nullundstatus: 'VALUE_CHANGED'.Ursache ist, dass
getValueAsNumber(null)undgetValueAsNumber('')derzeit0zurückgeben undNUMERIC_MATCHnicht vorher aufnull/leer prüft.Erwartetes Verhalten
NUMERIC_MATCH = 0sollte nur tatsächliche numerische Nullwerte treffen, z. B.0,'0','00','0,0', aber nichtnulloder leere Strings.Leere bzw. technische Nullwerte sollten stattdessen explizit über
IS_EMPTYbzw.IS_NULLkodiert werden können.Workaround
Bis zur Korrektur können vor der
NUMERIC_MATCH = 0-Regel eigene Codes fürIS_EMPTYund ggf.IS_NULLmit 0 Punkten angelegt werden. Da Codes in Reihenfolge geprüft werden, fangen diese Regeln leere/null-Werte ab, bevor die numerische 0-Regel greift.Hinweis
Eine Änderung kann bestehende Kodierschemata beeinflussen, falls diese bisher implizit darauf beruhen, dass leer/null als numerische 0 zählt. Daher sollte der Fix vermutlich mit Release-Hinweis bzw. Migrationsempfehlung erfolgen.