2017-01-16 38 views
1

mirtパッケージを使用すると、私の名目モデルで奇妙な結果が得られました。ノミナルモデルの奇妙な結果

library(difNLR) 
library(mirt) 
data("GMATtest", "GMATkey") 
key <- as.numeric(as.factor(GMATkey)) 
data <- sapply(1:20, function(i) as.numeric(GMATtest[, i])) 
colnames(data) <- paste("Item", 1:ncol(data)) 
scoredGMAT <- key2binary(data, key) 

# 2PL IRT model for scored data 
mod0 <- mirt(scoredGMAT, 1) 
# nominal model for unscored data 
mod1 <- mirt(data, 1, 'nominal') 

# plots of characteristic curves for item 1 
itemplot(mod0, 1) 
itemplot(mod1, 1) 

enter image description hereenter image description here

私はmod0に対してプロットとしてノミナルモデルmod1のために正しい答えに非常に似て1つの曲線があるだろうと予想しました。しかし、それほど妥当ではないように、ジッタが増加するにつれてジッタが増加するようである。もちろん、データに何か問題がある可能性があります。または、おそらく私は何かが欠けている可能性があります。

私は既にmirtの例をチェックしました。

どのような提案(何が間違っているかもしれない)をいただければ幸いです!

1つ最後のこと - 私も2PLNRMモデルに適合しようとしましたが、私のRセッションは中止されました。誰もが同じ問題に気づいた?私のコード:

# 2PLNRM model 
mod2 <- mirt(data, 1, "2PLNRM", key = key) 
coef(mod2)$`Item 1` 
itemplot(mod2, 1) 

EDIT:mirtパッケージからの例では、 あります:私はすべての項目のnominalモデルに適合しようとすると、

library(mirt) 
data(SAT12) 
SAT12[SAT12 == 8] <- NA #set 8 as a missing value 
head(SAT12) 

# correct answer key 
key <- c(1, 4, 5, 2, 3, 1, 2, 1, 3, 1, 2, 4, 2, 1, 5, 3, 4, 4, 1, 4, 3, 
     3, 4, 1, 3, 5, 1, 3, 1, 5, 4, 5) 
scoredSAT12 <- key2binary(SAT12, key) 
mod0 <- mirt(scoredSAT12, 1) 

# for first 5 items use 2PLNRM and nominal 
scoredSAT12[, 1:5] <- as.matrix(SAT12[, 1:5]) 
mod1 <- mirt(scoredSAT12, 1, c(rep('nominal', 5), rep('2PL', 27))) 

coef(mod0)$Item.1 
coef(mod1)$Item.1 

itemplot(mod0, 1) 
itemplot(mod1, 1) 

そして結果は、しかし、私が期待したものです、曲線が変更されました:

# nominal for all items 
mod1 <- mirt(SAT12, 1, 'nominal') 
coef(mod1)$Item.1 
itemplot(mod1, 1) 

あなたが提案したように、シータとその解釈は変わったが、なぜ、どのように?

+0

P1が正解である場合、それは、ジッタが減少するにつれて確率が増加することに注意してください。これは、ディストラクタの反対です。この意味で、モデリングは意味をなさないでしょう。この動作が一貫しているかどうかを確認するために他のアイテムをチェックしましたか? –

+0

確かに私は理解していますが、P1をチェックすると、それが減少して増えていないように見えます。正解なので、モデリングは私には意味がありません。他の項目は類似しているようです。 – Adela

+2

すべての項目について正しい答えが常にthetaが減少するもので、distractorsがthetaが増加するものである場合、 'mirt'によって与えられた結果は一貫しています。 しかし、この特定のケースでは、このタイプのモデリングではシータの意味を再考する必要があります。これはコード関連の問題ではありません。 –

答えて

1

@Juan Boscoは、この動作が一貫していることが正しいです。すべてのアイテムに名目応答モデルを使用する際の問題は、方向が任意であるため(デフォルトでは順序付けられていないため)、モデルでは$ \ theta $値の増加方向が明白でないことです。

また、最低/最高数値のカテゴリは、低/高$ \シータ$値に関連する必要があることを前提としていmirtのデフォルトパラメータ化、の、反転のこのタイプは、複数の選択肢型の項目では一般的であるため、(ここで、モデルはこれらの識別制約と最もよく一致する方位を選択するため、評価スケールの順序付きデータとは異なり、直接的な関係はないはずです)。

この問題を解決するには、mirtで使用されているスコアリング制約を、最高の固定スコアリング係数を提供された実際のスコアリング鍵に置き換えるだけで、その定義を再定義するだけです。これと同じように:非常に少なくとも

#starting values data.frame 
sv <- mirt(data, 1, 'nominal', pars = 'values') 
head(sv) 

# set all values to 0 and estimated 
sv$value[grepl('ak', sv$name)] <- 0 
sv$est[grepl('ak', sv$name)] <- TRUE 

nms <- colnames(data) 
for(i in 1:length(nms)){ 

    #set highest category based on key fixed to 3 
    pick <- paste0('ak', key[i]-1) 
    index <- sv$item == nms[i] & pick == sv$name 
    sv[index, 'value'] <- 3 
    sv[index, 'est'] <- FALSE 

    # set arbitrary lowest category fixed at 0 
    if(pick == 'ak0') pick2 <- 'ak3' 
    else pick2 <- paste0('ak', key[i]-2) 
    index2 <- sv$item == nms[i] & pick2 == sv$name 
    sv[index2, 'est'] <- FALSE 
} 

#estimate 
mod2 <- mirt(data, 1, 'nominal', pars=sv) 
plot(mod2, type = 'trace') 
itemplot(mod2, 1) 
coef(mod2, simplify=TRUE) 

、これはカテゴリが最も高いモデルを通知し、したがって、より適切な向きで終了するのに十分な情報を提供します。実際には、スロープに-1が乗算され、それに応じてスコアリング係数が調整されるため、実際にはモデルの解釈には影響しないことに注意してください。 HTH。

+0

ありがとうございます。それは非常に便利です。それはまさに私が探していたものです – Adela

0

まあ、Juanの示唆しているように、問題は、異なるIRTモデルを使用しているときにthetaの推定値が変更されることです。さらに、2PLnominalモデルによる見積りの間にはいくつかの関係があります。

library(difNLR) 
library(mirt) 
data("GMATtest", "GMATkey") 
key <- as.numeric(as.factor(GMATkey)) 
data <- sapply(1:20, function(i) as.numeric(GMATtest[, i])) 
colnames(data) <- paste("Item", 1:ncol(data)) 
scoredGMAT <- key2binary(data, key) 

# 2PL IRT model for scored data 
mod0 <- mirt(scoredGMAT, 1) 
# nominal model for unscored data 
mod1_all <- mirt(data, 1, 'nominal') 
# nominal model for only first item 
df <- data.frame(data[, 1], scoredGMAT[, 2:20]) 
mod1_1 <- mirt(df, 1, c('nominal', rep('2PL', 19))) 

# plots of characteristic curves for item 1 
itemplot(mod0, 1) 
itemplot(mod1_all, 1) 
itemplot(mod1_1, 1) 

# factor scores 
fs0 <- fscores(mod0) 
fs1_all <- fscores(mod1_all) 
fs1_1 <- fscores(mod1_1) 


plot(fs1_all ~ fs0) 
plot(fs1_1 ~ fs0) 

enter image description here

# linear model 
round(coef(lm(fs1_all ~ fs0)), 4) 

(Intercept)   fs0 
    -0.0001  -0.9972 

これは、それはほとんどマイナス元シータだとして新しいシータは、かなりの知識 'より「ignoration」のようかなっているようです。

あなたのアイデアのためにJuanに感謝し、彼らは本当に役に立ちました!