Learn R Programming

LSAmitR (version 1.0-2)

Kapitel 8: Kapitel 8: Fehlende Daten und Plausible Values

Description

Das ist die Nutzerseite zum Kapitel 8, Fehlende Daten und Plausible Values, im Herausgeberband Large-Scale Assessment mit R: Methodische Grundlagen der <U+00F6>sterreichischen Bildungsstandard<U+00FC>berpr<U+00FC>fung. Im Abschnitt Details werden die im Kapitel verwendeten R-Syntaxen zur Unterst<U+00FC>tzung f<U+00FC>r Leser/innen kommentiert und dokumentiert. Im Abschnitt Examples werden die R-Syntaxen des Kapitels vollst<U+00E4>ndig wiedergegeben und gegebenenfalls erweitert.

Arguments

Details

Vorbereitungen

Zur Illustration der Konsequenzen fehlender Daten und der Messfehlerbehaftetheit von Variablen soll zun<U+00E4>chst ein Illustrationsdatensatz (data08I) mit N=1500 simuliert werden. Dabei sollen zwei Variablen vorliegen: Der Sozialstatus X soll teilweise fehlende Werte aufweisen und die zu erfassende Kompetenz liegt sowohl als wahrer Wert \(\theta\) als auch als messfehlerbehaftete Variable \(\hat{\theta}\) vor. Im Datensatz data08I liegt sowohl der vollst<U+00E4>ndig beobachtete Sozialstatus (x) als auch derselbe Sozialstatus mit teilweise fehlenden Variablen (X) vor. Neben dem Illustrationsdatensatz werden in diesem Kapitel Datens<U+00E4>tze der <U+00F6>sterreichischen Bildungsstandards im Fach Englisch verwendet. Der Datensatz data08H enth<U+00E4>lt Kovariaten (d.h. Variablen aus Frageb<U+00F6>gen oder administrative Daten) auf Ebene der Sch<U+00FC>ler (Ebene 1) und auf Ebene der Schulen (Ebene 2). Variablen beider Ebenen k<U+00F6>nnen dabei fehlende Werte besitzen. Im Datensatz data08J sind fehlende Werte des Datensatzes data08H durch eine Ersetzung von Werten bereits aufgef<U+00FC>llt. Au<U+00DF>erdem liegen Item Responses der Sch<U+00FC>ler f<U+00FC>r den Bereich H<U+00F6>rverstehen (Listening, L) im Datensatz data08K vor. Folgende R-Pakete werden in diesem Kapitel verwendet: mice, miceadds, TAM, pls.

library(miceadds) library(mice) library(TAM) library(pls)

Abschnitt 8.1.1: Konsequenzen fehlender Daten und messfehlerbehafteter Variablen

Listing 1: Deskriptive Statistiken des Datensatzes

Mit folgendem R-Code werden deskriptive Statistiken des Datensatzes data08I ermittelt, an denen die Bedeutung der geeigneten Behandlung fehlender Werte und von Messfehlern herausgearbeitet werden soll.

data(datenKapitel08) dat <- datenKapitel08$data08I[,-1] #*** Missinganteile round( colMeans( is.na(dat), na.rm=TRUE) , 2 ) #*** Mittelwerte round( apply( dat , 2 , mean , na.rm=TRUE ) , 2 ) #*** Zusammenhang von Missingindikator und Variablen round( miceadds::mi_dstat( dat[,c("WLE","X")] ) , 2 ) #*** Varianzen round( apply( dat , 2 , var , na.rm=TRUE ) , 2 ) #*** Korrelationsmatrix round( cor( dat , use = "pairwise.complete.obs") , 2 )

Abschnitt 8.2.5: Durchf<U+00FC>hrung der multiplen Imputation in R

Listing 2: Variablenauswahl und leere Imputation

In diesem Abschnitt wird die multiple Imputation basierend auf dem MICE-Ansatz im Paket mice in R umgesetzt. Als Datensatz soll data08H verwendet werden. Zur Vereinfachung der Darstellung w<U+00E4>hlen wir auf der Ebene der Sch<U+00FC>ler die Variablen Sozialstatus (HISEI), Anzahl der B<U+00FC>cher zu Hause (buch) und den WLE der H<U+00F6>rverstehenskompetenz (E8LWLE) sowie einen auf der Schulebene erfassten Sozialstatus (SES_Schule) aus.

set.seed(56) dat <- datenKapitel08$data08H # w<U+00E4>hle Variablen aus dat1 <- dat[ , c("idschool", "HISEI", "buch", "E8LWLE", "SES_Schule") ] colMeans(is.na(dat1)) # f<U+00FC>hre leere Imputation durch imp0 <- mice::mice(dat1, m=0, maxit=0)

Listing 3: Spezifikation der Imputationsmethoden

Die nachfolgende Syntax zeigt die Spezifikation der Imputationsmethoden im Vektor impMethod in mice f<U+00FC>r unser Datenbeispiel.

impMethod <- imp0$method impMethod["HISEI"] <- "2l.continuous" # [...] weitere Spezifikationen impMethod["SES_Schule"] <- "2lonly.norm" impMethod

Listing 4: Definition der Pr<U+00E4>diktormatrix f<U+00FC>r die Imputation in mice

Nachfolgender R-Code zeigt die Definition der Pr<U+00E4>diktormatrix (Matrix predMatrix) f<U+00FC>r die Imputation in mice.

predMatrix <- imp0$predictorMatrix predMatrix[-1,"idschool"] <- -2 # [...] predMatrix

Listing 5: Datenimputation

Die Imputation kann nun unter dem Aufruf der Funktion mice unter <U+00DC>bergabe der Imputationsmethoden und der Pr<U+00E4>diktormatrix erfolgen. F<U+00FC>r das PMM werden 5 Donoren gew<U+00E4>hlt. Insgesamt sollen 10 imputierte Datens<U+00E4>tze generiert werden, wobei der Algorithmus 7 Iterationen durchlaufen soll.

imp1 <- mice::mice( dat1, imputationMethod=impMethod, predictorMatrix=predMatrix, donors=5, m=10, maxit=7 )

Abschnitt 8.3.2: Dimensionsreduzierende Verfahren f<U+00FC>r Kovariaten im latenten Regressionsmodell

Listing 6: Kovariatenauswahl, Interaktionsbildung und Bestimmung PLS-Faktoren

Die Methode des Partial Least Squares soll f<U+00FC>r den Datensatz data08J illustriert werden. Es wird zum Auff<U+00FC>llen der Kovariaten mit fehlenden Werten nur ein imputierter Datensatz erstellt. Danach wird eine PLS-Regression des WLE der H<U+00F6>rverstehenskompetenz E8LWLE auf Kovariaten und deren Interaktionen bestimmt. F<U+00FC>r die Bestimmung der PLS-Faktoren wird das R-Paket pls verwendet. Die nachfolgende R-Syntax zeigt die Kovariatenauswahl, die Bildung der Interaktionen und die Bestimmung der PLS-Faktoren. Insgesamt entstehen durch Aufnahme der Haupteffekte und Interaktionen 55 Kovariaten.

dat <- datenKapitel08$data08J #*** Kovariatenauswahl kovariaten <- scan(what="character", nlines=2) female migrant HISEI eltausb buch SK LF NSchueler NKlassen SES_Schule

X <- scale( dat[, kovariaten ] ) V <- ncol(X) # bilde alle Zweifachinteraktionen c2 <- combinat::combn(V,2) X2 <- apply( c2 , 2 , FUN = function(cc){ X[,cc[1]] * X[,cc[2]] } ) X0 <- cbind( X , X2 ) mod1 <- pls::plsr( dat$E8LWLE ~ X0 , ncomp=55 ) summary(mod1)

Abschnitt 8.3.3: Ziehung von Plausible Values in R

In diesem Abschnitt soll die Ziehung von Plausible Values mit dem R-Paket TAM illustriert werden. Dabei beschr<U+00E4>nken wir uns auf den Kompetenzbereich des H<U+00F6>rverstehens.

Listing 7: PLS-Faktoren ausw<U+00E4>hlen

In Abschnitt 8.3.2 wurden dabei die Kovariaten auf PLS-Faktoren reduziert. F<U+00FC>r die Ziehung von Plausible Values werden nachfolgend 10 PLS-Faktoren verwendet.

facs <- mod1$scores[,1:10]

Listing 8: Rasch-Skalierung

F<U+00FC>r die H<U+00F6>rverstehenskompetenz im Datensatz data08K wird nachfolgend das Messmodell als Rasch-Modell gesch<U+00E4>tzt. Dabei werden Stichprobengewichte f<U+00FC>r die Bestimmung der Itemparameter verwendet.

dat2 <- datenKapitel08$data08K items <- grep("E8L", colnames(dat2), value=TRUE) # Sch<U+00E4>tzung des Rasch-Modells in TAM mod11 <- TAM::tam.mml( resp= dat2[,items ] , pid = dat2$idstud, pweights = dat2$wgtstud )

Listing 9: Individuelle Likelihood, latente Regressionsmodell und PV-Ziehung

Bei einer Fixierung von Itemparametern ist die bedingte Verteilung \(P(\mathbf{X}|\boldsymbol{\theta})\) des Messmodells konstant. Die Sch<U+00E4>tzung von Item-Response-Modellen erfolgt in TAM unter Verwendung eines diskreten Gitters von \(\boldsymbol{\theta}\)-Werten. W<U+00E4>hrend der Anpassung des Rasch-Modells in mod11 liegt daher die auf diesem Gitter ausgewertete sog. individuelle Likelihood \(P(\mathbf{X}|\boldsymbol{\theta})\) vor, die mit der Funktion IRT.likelihood aus dem Objekt mod11 extrahiert werden kann. Das latente Regressionsmodell kann unter R<U+00FC>ckgriff auf die individuelle Likelihood mit der Funktion tam.latreg angepasst werden. Die Ziehung der Plausible Values erfolgt anschlie<U+00DF>end mit der Funktion tam.pv.

#*** extrahiere individuelle Likelihood lmod11 <- IRT.likelihood(mod11) #*** sch<U+00E4>tze latentes Regressionsmodell mod12 <- TAM::tam.latreg( like = lmod11 , Y = facs ) #*** ziehe Plausible Values pv12 <- TAM::tam.pv(mod12, normal.approx=TRUE, samp.regr=TRUE , ntheta=400)

Listing 10: Plausible Values extrahieren

Die imputierten Plausible Values lassen sich im Element $pv des Ergebnisobjekts aus tam.pv extrahieren.

#*** Plausible Values f<U+00FC>r drei verschiedene Sch<U+00FC>ler round( pv12$pv[c(2,5,9),] , 3 )

References

Robitzsch, A., Pham, G. & Yanagida, T. (2016). Fehlende Daten und Plausible Values. In S. Breit & C. Schreiner (Hrsg.), Large-Scale Assessment mit R: Methodische Grundlagen der <U+00F6>sterreichischen Bildungsstandard<U+00FC>berpr<U+00FC>fung (pp. 259--293). Wien: facultas.

See Also

Zu datenKapitel08, den im Kapitel verwendeten Daten. Zur<U+00FC>ck zu Kapitel 7, Statistische Analysen produktiver Kompetenzen . Zu Kapitel 9, Fairer Vergleich in der R<U+00FC>ckmeldung. Zur <U+00DC>bersicht.

Examples

Run this code
# NOT RUN {
library(TAM)
library(mice)
library(miceadds)
library(pls)
library(combinat)
library(mitml)

data(datenKapitel08)
data08H <- datenKapitel08$data08H
data08I <- datenKapitel08$data08I
data08J <- datenKapitel08$data08J
data08K <- datenKapitel08$data08K

# }
# NOT RUN {
## -------------------------------------------------------------
## Abschnitt 8.1.1: Konsequenzen fehlender Daten und 
##                  messfehlerbehafteter Variablen
## -------------------------------------------------------------

# -------------------------------------------------------------
# Abschnitt 8.1.1, Listing 1: Deskriptive Statistiken des 
#                             Illustrationsdatensatzes
#

data(datenKapitel08)
dat <- datenKapitel08$data08I[,-1]
#*** Missinganteile
round( colMeans( is.na(dat), na.rm=TRUE) , 2 )     
#*** Mittelwerte
round( apply( dat , 2 , mean , na.rm=TRUE ) , 2 )   
#*** Zusammenhang von Missingindikator und Variablen 
round( miceadds::mi_dstat( dat[,c("WLE","X")] ) , 2 )
#*** Varianzen
round( apply( dat , 2 , var , na.rm=TRUE ) , 2 ) 
#*** Korrelationsmatrix
round( cor( dat , use = "pairwise.complete.obs") , 2 )


## -------------------------------------------------------------
## Abschnitt 8.2: Multiple Imputation
## -------------------------------------------------------------

# -------------------------------------------------------------
# Abschnitt 8.2.5, Listing 1: Variablenauswahl und leere 
#                             Imputation
#

set.seed(56) 
data(datenKapitel08)
dat <- datenKapitel08$data08H
# w<U+00E4>hle Variablen aus 
dat1 <- dat[ , c("idschool", "HISEI", "buch", "E8LWLE",
                 "SES_Schule") ]
colMeans(is.na(dat1)) 
# f<U+00FC>hre leere Imputation durch
imp0 <- mice::mice(dat1, m=0, maxit=0)

# -------------------------------------------------------------
# Abschnitt 8.2.5, Listing 2: Spezifikation der Imputations-
#                             methoden
#

impMethod <- imp0$method 
impMethod["HISEI"] <- "2l.continuous" 
# [...]  weitere Spezifikationen
impMethod["SES_Schule"] <- "2lonly.norm" 
impMethod     

# -------------------------------------------------------------
# Abschnitt 8.2.5, Listing 2b: Erg<U+00E4>nzung zum Buch
#

# [...]  weitere Spezifikationen
impMethod["buch"]  <- "2l.pmm"
impMethod

# -------------------------------------------------------------
# Abschnitt 8.2.5, Listing 3: Definition der Pr<U+00E4>diktormatrix 
#                             f<U+00FC>r die Imputation in mice
#

predMatrix <- imp0$predictorMatrix 
predMatrix[-1,"idschool"] <- -2 
# [...]
predMatrix    

# -------------------------------------------------------------
# Abschnitt 8.2.5, Listing 3b: Erg<U+00E4>nzung zum Buch
#

# [...]
predMatrix[2:4,2:4] <- 3*predMatrix[2:4,2:4]
predMatrix

# -------------------------------------------------------------
# Abschnitt 8.2.5, Listing 4: F<U+00FC>hre Imputation durch
#

imp1 <- mice::mice( dat1, imputationMethod=impMethod, 
  predictorMatrix=predMatrix, donors=5, m=10, maxit=7)

# -------------------------------------------------------------
# Abschnitt 8.2.5, Listing 4b: Erg<U+00E4>nzung zum Buch
#

#-- Mittelwert HISEI
wmod1 <- with( imp1 , lm(HISEI ~ 1))
summary( mice::pool( wmod1 ) )

#-- lineare Regression HISEI auf B<U+00FC>chervariable
wmod2 <- with( imp1 , lm(E8LWLE ~ HISEI) )
summary( mice::pool( wmod2 ))

#-- Inferenz Mehrebenenmodelle mit Paket mitml
imp1b <- mitml::mids2mitml.list(imp1)
wmod3 <- with(imp1b, lme4::lmer( HISEI ~ (1|idschool)) )
mitml::testEstimates(wmod3, var.comp=TRUE)

## ------------------------------------------------------------
## Abschnitt 8.3.2: Dimensionsreduzierende Verfahren f<U+00FC>r 
## Kovariaten im latenten Regressionsmodell
## ------------------------------------------------------------

# -------------------------------------------------------------
# Abschnitt 8.3.2, Listing 1: Kovariatenauswahl, Interaktions- 
#                         bildung und Bestimmung PLS-Faktoren
#

set.seed(56)
data(datenKapitel08)
dat <- datenKapitel08$data08J

#*** Kovariatenauswahl
kovariaten <- scan(what="character", nlines=2) 
  female migrant HISEI  eltausb buch  
  SK LF NSchueler NKlassen SES_Schule

X <- scale( dat[, kovariaten ] )
V <- ncol(X) 
# bilde alle Zweifachinteraktionen 
c2 <- combinat::combn(V,2) 
X2 <- apply( c2 , 2 , FUN = function(cc){ 
            X[,cc[1]] * X[,cc[2]] } ) 
X0 <- cbind( X , X2 )
# Partial Least Squares Regression
mod1 <- pls::plsr( dat$E8LWLE ~ X0 , ncomp=55  ) 
summary(mod1)

# -------------------------------------------------------------
# Abschnitt 8.3.2, Listing 1b: Erg<U+00E4>nzung zum Buch
# Abbildung: Aufgekl<U+00E4>rter Varianzanteil
#

# Principal Component Regression (Extraktion der Hauptkomponenten)
mod2 <- pls::pcr(  dat$E8LWLE ~ X0 , ncomp=55 )
summary(mod2)

#*** extrahierte Varianzen mit PLS-Faktoren und PCA-Faktoren
res <- mod1
R2 <- base::cumsum(res$Xvar) / res$Xtotvar
ncomp <- 55
Y <- dat$E8LWLE
R21 <- base::sapply( 1:ncomp , FUN = function(cc){
  1 - stats::var( Y -  res$fitted.values[,1,cc] ) / stats::var( Y )
} )
dfr <- data.frame("comp" = 1:ncomp , "PLS" = R21 )

res <- mod2
R2 <- base::cumsum(res$Xvar) / res$Xtotvar
ncomp <- 55
Y <- dat$E8LWLE
R21 <- base::sapply( 1:ncomp , FUN = function(cc){
           1 - stats::var( Y -  res$fitted.values[,1,cc] ) / stats::var( Y )
} )
dfr$PCA <- R21


plot( dfr$comp , dfr$PLS , type="l" , xlab="Anzahl Faktoren" , 
      ylab="Aufgekl<U+00E4>rter Varianzanteil" ,
      ylim=c(0,.3) )
points( dfr$comp , dfr$PLS , pch=16 )        
points( dfr$comp , dfr$PCA , pch=17 )        
lines( dfr$comp , dfr$PCA , lty=2 )        
legend( 45 , .15 , c("PLS" , "PCA") , pch=c(16,17) , lty=c(1,2))

## ------------------------------------------------------------
## Abschnitt 8.3.3: Ziehung von Plausible Values in R
## ------------------------------------------------------------

# -------------------------------------------------------------
# Abschnitt 8.3.3, Listing 1: PLS-Faktoren ausw<U+00E4>hlen
#

facs <- mod1$scores[,1:10]

# -------------------------------------------------------------
# Abschnitt 8.3.3, Listing 1b: Erg<U+00E4>nzung zum Buch
#
set.seed(98766)

# -------------------------------------------------------------
# Abschnitt 8.3.3, Listing 2: Anpassung kognitive Daten
#

data(datenKapitel08)
dat2 <- datenKapitel08$data08K
items <- grep("E8L", colnames(dat2), value=TRUE)
# Sch<U+00E4>tzung des Rasch-Modells in TAM
mod11 <- TAM::tam.mml( resp= dat2[,items ] , 
       pid = dat2$idstud, pweights = dat2$wgtstud ) 

# -------------------------------------------------------------
# Abschnitt 8.3.3, Listing 3: Individuelle Likelihood, latentes 
#                             Regressionsmodell und PV-Ziehung
#

#*** extrahiere individuelle Likelihood
lmod11 <- IRT.likelihood(mod11) 
#*** sch<U+00E4>tze latentes Regressionsmodell
mod12 <- TAM::tam.latreg( like = lmod11 , Y = facs )
#*** ziehe Plausible Values 
pv12 <- TAM::tam.pv(mod12, normal.approx=TRUE, 
               samp.regr=TRUE , ntheta=400)

# -------------------------------------------------------------
# Abschnitt 8.3.3, Listing 4: Plausible Values extrahieren
#

#*** Plausible Values f<U+00FC>r drei verschiedene Sch<U+00FC>ler
round( pv12$pv[c(2,5,9),] , 3 )


# -------------------------------------------------------------
# Abschnitt 8.3.3, Listing 4b: Erg<U+00E4>nzung zum Buch
#

hist( pv12$pv$PV1.Dim1 )

# Korrelation mit Kovariaten
round( cor( pv12$pv$PV1.Dim1 , dat[,kovariaten] , 
            use="pairwise.complete.obs") , 3 )
round( cor( dat$E8LWLE , dat[,kovariaten] , 
            use="pairwise.complete.obs" ) , 3 )
# }
# NOT RUN {
<!-- %end dontrun -->
# }

Run the code above in your browser using DataLab