Teoria da Resposta ao Item com uso do R

Adilson dos Anjos
Departamento de Estatística - UFPR
Programa de Pós-graduação em Engenharia de Produção, UFSC
aanjos@ufpr.br
Dalton Francisco de Andrade
Departamento de Informática e Estatística, UFSC
dandrade@inf.ufsc.br

15 de março de 2012

Capítulo 1
Introdução

Durante o curso será utilizada a versão mais nova do software R. Este material foi preparado com a seguinte versão do software R:

  > R.Version()$version
  [1] "R version 2.14.2 (2012-02-29)"

1.1 Instalar e carregar pacotes

1.1.1 Rstudio

Durante o curso sugere-se a utilização do software RStudio como front-end do software R. Entre na página www.rstudio.org e baixe a versão compatível com seu sistema operacional.

1.1.2 Recursos do R para Psicometria (packages)

O software R possui milhares de pacotes (packages) disponíveis. Alguns desses pacotes foram agrupados em função de áreas em comum. Esses agrupamentos são chamados de Task Views e estão disponíveis no site do R.

Em http://cran-r.c3sl.ufpr.br/web/views/ há um conjunto de pacotes organizados na área de Psicometria chamado Psychometrics que pode ser acessado em http://cran-r.c3sl.ufpr.br/web/views/Psychometrics.html

Para instalar um pacote, utilize a função install.package('nomedopacote') (com aspas).

Para utilizar o pacote utilize a função library(nomedopacote) (sem aspas).

1.1.3 Datasets

Em vários pacotes do R existem conjuntos de dados (datasets) disponíveis, que são utilizados nos exemplos de utilização de funções. Nesse curso, serão utilizados dados reais e dados disponíveis em alguns dos pacotes da área de Psicometria.

Para saber quais os datasets instalados em seu computador digite data().

Para utilizar dados de algum pacote, digite data(nomedodataset).

Capítulo 2
Teoria clássica dos testes (TCT)

Nesse capítulo será apresentado como realizar uma análise clássica utilizando algumas funções do software R. Serão utilizados os pacotes ltm e CTT.

2.1 Exemplo: LSAT (ltm)

2.1.1 Dados LSAT

Utilizaremos o conjunto de dados LSAT disponível no pacote ltm que pode ser obtido da seguinte forma:

  > library(ltm)
  > data(LSAT)

Para mais informações sobre esse conjunto de dados, utilize ?LSAT.

2.1.2 TCT com pacote ltm

Existem várias estatísticas que podem ser utilizadas para examinar um conjunto de respostas de um teste. Por exemplo, a correlação bisserial e o coeficiente de alpha de Cronbach.

A função descript() do pacote ltm aplicada aos dados LSAT fornece os seguintes resultados:

  > lsat.desc<-descript(LSAT)
  > names(lsat.desc)

   [1] "sample"    "perc"      "items"     "pw.ass"
   [5] "n.print"   "name"      "missin"    "data"
   [9] "bisCorr"   "ExBisCorr" "alpha"

  > lsat.desc

  Descriptive statistics for the 'LSAT' data-set
  
  Sample:
   5 items and 1000 sample units; 0 missing values
  
  Proportions for each level of response:
             0     1  logit
  Item 1 0.076 0.924 2.4980
  Item 2 0.291 0.709 0.8905
  Item 3 0.447 0.553 0.2128
  Item 4 0.237 0.763 1.1692
  Item 5 0.130 0.870 1.9010
  
  
  Frequencies of total scores:
       0  1  2   3   4   5
  Freq 3 20 85 237 357 298
  
  
  Point Biserial correlation with Total Score:
         Included Excluded
  Item 1   0.3618   0.1128
  Item 2   0.5665   0.1531
  Item 3   0.6181   0.1727
  Item 4   0.5342   0.1444
  Item 5   0.4351   0.1215
  
  
  Cronbach's alpha:
                    value
  All Items        0.2950
  Excluding Item 1 0.2754
  Excluding Item 2 0.2376
  Excluding Item 3 0.2168
  Excluding Item 4 0.2459
  Excluding Item 5 0.2663
  
  
  Pairwise Associations:
     Item i Item j p.value
  1       1      5   0.565
  2       1      4   0.208
  3       3      5   0.113
  4       2      4   0.059
  5       1      2   0.028
  6       2      5   0.009
  7       1      3   0.003
  8       4      5   0.002
  9       3      4   7e-04
  10      2      3   4e-04

Os resultados mostram a correlação ponto bisserial, o coeficiente alfa de Cronbah e as associações entre itens além da frequência de respostas de cada item.

Observe que na análise da associação existem alguns resultados que indicam dependência entre itens.

2.1.3 Gráficos

Ainda, é possível fazer um gráfico com os resultados da função descript().



Figura 2.1: Gráfico do item.
  > plot(lsat.desc,type='b',includeFirstLast=TRUE)

PIC


A opção includeFirstLast=TRUE indica que todos os scores devem ser inseridos no gráfico.

No exemplo observa-se que aqueles que acertaram apenas um item, cerca 50% destes respondentes acertaram o item 1.

Quando há muitos itens pode ser necessário realizar a análise por partes:



Figura 2.2: Gráfico dos itens 1 a 5.
  > plot(lsat.desc,items=c(1:3),type="b",includeFirstLast=TRUE,pch=c('1','2','3'))

PIC


2.1.4 Correlação bisserial

A correlação bisserial entre o score total e um item pode ser obtida com a função biserial.cor()

  > biserial.cor(rowSums(LSAT), LSAT[[1]])

  [1] -0.3618294

Compare com a saída da função descript() e observe o sinal da correlação. O valor é o mesmo mas o sinal é diferente. Isso se deve ao fato de que a função considerao primeiro nível das respostas para obter o valor da correlação. Alterando a opção level para 2, obtem-se o mesmo resultado da função descript():

  > biserial.cor(rowSums(LSAT), LSAT[[1]], level = 2)

  [1] 0.3618294

2.1.5 Coeficiente de Cronbach

A função cronbach.alpha() fornece o valor do coeficiente de correlação de Cronbah entre os itens.

  > cronbach.alpha(LSAT)

  Cronbach's alpha for the 'LSAT' data-set
  
  Items: 5
  Sample units: 1000
  alpha: 0.295

Para obter o mesmo resultado da função descript() utilize da seguinte forma:

  > cronbach.alpha(LSAT[-1])  # exclui o item 1

  Cronbach's alpha for the 'LSAT[-1]' data-set
  
  Items: 4
  Sample units: 1000
  alpha: 0.275

2.1.6 TCT com pacote CTT

Além do pacote ltm há também o pacote CTT que pode ser utilizado para obtenção de algumas estatísticas de interesse na análise clássica de testes.

Inicialmente carregue o pacote CTT:

  > library(CTT)

A função reliability() do pacote CTT pode ser utilizada para obter o coeficiente Alpha de Cronbach e outras estatísticas:

  > lsat.reliab<-reliability(LSAT)
  > names(lsat.reliab)

  [1] "N_item"           "N_person"         "alpha"
  [4] "scale.mean"       "scale.sd"         "alpha.if.deleted"
  [7] "pbis"             "item.mean"

  > lsat.reliab

   Number of Items
   5
  
   Number of Examinees
   1000
  
   Coefficient Alpha
   0.295

Por exemplo, pode-se ter interesse na correlação ponto bisserial:

  > lsat.reliab$pbis

  [1] 0.1128327 0.1531781 0.1727789 0.1444281 0.1215964

Observe que essa correlação refere-se ao valor com a exclusão do item, na ordem em que são apresentados. Compare com os resultados da função descript().

Para ver mais resultados da função reliability() use:

  > str(lsat.reliab)

  List of 8
   $ N_item          : int 5
   $ N_person        : int 1000
   $ alpha           : num 0.295
   $ scale.mean      : num 3.82
   $ scale.sd        : num 1.04
   $ alpha.if.deleted: num [1:5(1d)] 0.275 0.238 0.217 0.246 0.266
   $ pbis            : num [1:5(1d)] 0.113 0.153 0.173 0.144 0.122
   $ item.mean       : Named num [1:5] 0.924 0.709 0.553 0.763 0.87
    ..- attr(*, "names")= chr [1:5] "Item 1" "Item 2" "Item 3" "Item 4" ...
   - attr(*, "class")= chr "reliability"

Capítulo 3
Uso do pacote ltm

Nesse capítulo serão utilizadas algumas funções para modelos dicotômicos de TRI. Em especial, utilizaremos o pacote ltm que é um dos mais completos dentro do R para uso na TRI.

3.1 Modelos Dicotômicos

Utilizaremos o conjunto de dados LSAT (Law School Admission Test, Bock e Lieberman (1970)) disponível dentro do pacote ltm:

  > library(ltm)
  > head(LSAT)

    Item 1 Item 2 Item 3 Item 4 Item 5
  1      0      0      0      0      0
  2      0      0      0      0      0
  3      0      0      0      0      0
  4      0      0      0      0      1
  5      0      0      0      0      1
  6      0      0      0      0      1

No capítulo anterior, utilizamos a função descript() para explorar esse conjunto de respostas:

No resultado da função descript é fornecida a proporção de respostas para cada item, a frequência de escores, a correlação bisserial e uma estatística χ2 para associações pareadas entre os cinco items.

rever Segundo Dimitris (2006), associações não significativas podem indicar itens problemáticos.

3.1.1 Modelo com 3 parâmetros

Para ajustar um modelo com 3 parâmetros utiliza-se a função tpm() da seguinte maneira.

  > lsat.tpm<-tpm(LSAT)

Os valores dos parâmetros estimados foram:

  > lsat.tpm

  Call:
  tpm(data = LSAT)
  
  Coefficients:
          Gussng  Dffclt  Dscrmn
  Item 1   0.037  -3.296   0.829
  Item 2   0.078  -1.145   0.760
  Item 3   0.012  -0.249   0.902
  Item 4   0.035  -1.766   0.701
  Item 5   0.053  -2.990   0.666
  
  Log.Lik: -2466.66

3.1.2 Gráficos

A análise gráfica dos itens também é útil na avaliação do ajuste dos modelos.

No R a função plot() pode assumir um comportamento específico para cada tipo de objeto. Por exemplo, a função plot aplicada ao objeto lsat.tpm produz a CCI.



Figura 3.1: CCI para os dados LSAT (sem legenda).
  > plot(lsat.tpm)

PIC


Uma legenda pode ser incluída com a opção legend=T:



Figura 3.2: CCI para os dados LSAT (com legenda).
  > plot(lsat.tpm,legend=T)

PIC


As curvas de informação do item podem ser obtidas da seguinte maneira:



Figura 3.3: CCI para os dados LSAT.
  > plot(lsat.tpm,type='IIC')

PIC


A função de informação do teste pode ser obtida da seguinte maneira:



Figura 3.4: TIF para os dados LSAT.
  > plot(lsat.tpm,type='IIC',items=0)

PIC


Um plot do objeto que contém a habilidade fornece um gráfico de densidade dessa variável.



Figura 3.5: Information para os dados LSAT.
  > plot(factor.scores(lsat.tpm,met="EAP"))

PIC


3.1.3 Estimação da proficiência

Os valores de θ podem ser obtidos com a função factor.scores() aplicada sobre o objeto da classe tpm que contém as estimativas dos parâmetros do modelo.

  > lsat.prof<-factor.scores(lsat.tpm,method="EAP")

O argumento method permite escolher qual o método de estimação das proficiências que será utilizado. Veja mais detalhes no arquivo de ajuda da função (use ?factor.scores).

Os valores de theta estimados são:

  > head(lsat.prof$score)

    Item 1 Item 2 Item 3 Item 4 Item 5 Obs   Exp         z1
  1      0      0      0      0      0   3 2.230 -1.8747570
  2      0      0      0      0      1   6 5.820 -1.4504946
  3      0      0      0      1      0   2 2.583 -1.4483752
  4      0      0      0      1      1  11 8.944 -1.0294589
  5      0      0      1      0      0   1 0.701 -1.3994145
  6      0      0      1      0      1   1 2.628 -0.9523559
        se.z1
  1 0.7963477
  2 0.7939338
  3 0.7910046
  4 0.7939350
  5 0.8196562
  6 0.8208767

3.1.4 Ajuste do modelo com dois parâmetros

O ajuste do modelo com dois parâmetros pode ser obtido com a função ltm().

Essa função pode ser especificada como uma fórmula onde o lado esquerdo deve conter objeto com os dados dos respondentes e do lado direito a variável latente z1:

  > fit2<-ltm(LSAT~z1)
  > fit2

  Call:
  ltm(formula = LSAT ~ z1)
  
  Coefficients:
          Dffclt  Dscrmn
  Item 1  -3.360   0.825
  Item 2  -1.370   0.723
  Item 3  -0.280   0.890
  Item 4  -1.866   0.689
  Item 5  -3.124   0.657
  
  Log.Lik: -2466.653

3.1.5 Ajuste do modelo de Rasch

A função rasch() do pacote ltm estima o parâmetro de discriminação. Para definir o parâmetro de discriminação como sendo 1, deve-se utilizar o argumento constraint.

Esse argumento deve ser fornecido na forma de uma matriz. Assim, para p itens o número p + 1 indica o parâmetro de discriminação. Assim, constraint=cbind(length(LSAT)+1,1) indica que o parâmetro p + 1, que corresponde ao parâmetro de discriminação, deve ser 1.

  > fit1<-rasch(LSAT,constraint=cbind(length(LSAT)+1,1))

Observe que o parâmetro de discriminação é 1, igual para todos os itens.

Para ver o resultado:

  > summary(fit1)

  Call:
  rasch(data = LSAT, constraint = cbind(length(LSAT) + 1, 1))
  
  Model Summary:
     log.Lik      AIC      BIC
   -2473.054 4956.108 4980.646
  
  Coefficients:
                  value std.err   z.vals
  Dffclt.Item 1 -2.8720  0.1287 -22.3066
  Dffclt.Item 2 -1.0630  0.0821 -12.9458
  Dffclt.Item 3 -0.2576  0.0766  -3.3635
  Dffclt.Item 4 -1.3881  0.0865 -16.0478
  Dffclt.Item 5 -2.2188  0.1048 -21.1660
  Dscrmn         1.0000      NA       NA
  
  Integration:
  method: Gauss-Hermite
  quadrature points: 21
  
  Optimization:
  Convergence: 0
  max(|grad|): 6.3e-05
  quasi-Newton: BFGS

Uma outra maneira de se obter os valores das estimativas dos parâmetros é:

  > coef(fit1,prob=TRUE, order=TRUE)

             Dffclt Dscrmn P(x=1|z=0)
  Item 1 -2.8719712      1  0.9464434
  Item 5 -2.2187785      1  0.9019232
  Item 4 -1.3880588      1  0.8002822
  Item 2 -1.0630294      1  0.7432690
  Item 3 -0.2576109      1  0.5640489

Sem o argumento constraint, a função estima o parâmetro de discriminação.

  > fit12<-rasch(LSAT)
  > summary(fit12)

  Call:
  rasch(data = LSAT)
  
  Model Summary:
     log.Lik      AIC      BIC
   -2466.938 4945.875 4975.322
  
  Coefficients:
                  value std.err   z.vals
  Dffclt.Item 1 -3.6153  0.3266 -11.0680
  Dffclt.Item 2 -1.3224  0.1422  -9.3009
  Dffclt.Item 3 -0.3176  0.0977  -3.2518
  Dffclt.Item 4 -1.7301  0.1691 -10.2290
  Dffclt.Item 5 -2.7802  0.2510 -11.0743
  Dscrmn         0.7551  0.0694  10.8757
  
  Integration:
  method: Gauss-Hermite
  quadrature points: 21
  
  Optimization:
  Convergence: 0
  max(|grad|): 2.5e-05
  quasi-Newton: BFGS

Os valores de θ podem ser obtidos com a função factor.scores():

  > factor.scores(fit2,met="EAP")

  Call:
  ltm(formula = LSAT ~ z1)
  
  Scoring Method: Expected A Posteriori
  
  Factor-Scores for observed response patterns:
     Item 1 Item 2 Item 3 Item 4 Item 5 Obs     Exp     z1
  1       0      0      0      0      0   3   2.277 -1.897
  2       0      0      0      0      1   6   5.861 -1.475
  3       0      0      0      1      0   2   2.596 -1.455
  4       0      0      0      1      1  11   8.942 -1.029
  5       0      0      1      0      0   1   0.696 -1.324
  6       0      0      1      0      1   1   2.614 -0.897
  7       0      0      1      1      0   3   1.179 -0.877
  8       0      0      1      1      1   4   5.955 -0.441
  9       0      1      0      0      0   1   1.840 -1.432
  10      0      1      0      0      1   8   6.431 -1.007
  11      0      1      0      1      1  16  13.577 -0.553
  12      0      1      1      0      1   3   4.370 -0.418
  13      0      1      1      1      0   2   2.000 -0.397
  14      0      1      1      1      1  15  13.920  0.054
  15      1      0      0      0      0  10   9.480 -1.366
  16      1      0      0      0      1  29  34.616 -0.940
  17      1      0      0      1      0  14  15.590 -0.919
  18      1      0      0      1      1  81  76.562 -0.485
  19      1      0      1      0      0   3   4.659 -0.787
  20      1      0      1      0      1  28  24.989 -0.349
  21      1      0      1      1      0  15  11.463 -0.328
  22      1      0      1      1      1  80  83.541  0.125
  23      1      1      0      0      0  16  11.254 -0.897
  24      1      1      0      0      1  56  56.105 -0.461
  25      1      1      0      1      0  21  25.646 -0.441
  26      1      1      0      1      1 173 173.310  0.008
  27      1      1      1      0      0  11   8.445 -0.304
  28      1      1      1      0      1  61  62.520  0.150
  29      1      1      1      1      0  28  29.127  0.172
  30      1      1      1      1      1 298 296.693  0.646
     se.z1
  1  0.801
  2  0.802
  3  0.802
  4  0.807
  5  0.803
  6  0.809
  7  0.810
  8  0.820
  9  0.803
  10 0.807
  11 0.817
  12 0.820
  13 0.821
  14 0.835
  15 0.803
  16 0.809
  17 0.809
  18 0.819
  19 0.811
  20 0.822
  21 0.823
  22 0.838
  23 0.809
  24 0.819
  25 0.820
  26 0.834
  27 0.824
  28 0.839
  29 0.840
  30 0.859

Após a calibração, pode-se utilizar um padrão de respostas qualquer para estimar a proficiência. Basta fornecer o padrão de repostas da seguinte forma:

  > factor.scores(fit2, resp.patterns = rbind(c(1,0,1,0,1), c(NA,1,0,NA,1)))

  Call:
  ltm(formula = LSAT ~ z1)
  
  Scoring Method: Empirical Bayes
  
  Factor-Scores for specified response patterns:
    Item 1 Item 2 Item 3 Item 4 Item 5 Obs     Exp     z1
  1      1      0      1      0      1  28  24.989 -0.373
  2     NA      1      0     NA      1   0 249.424 -0.170
    se.z1
  1 0.815
  2 0.859

Alternativamente, o objeto com o padrão de respostas pode ser fornecido de outra maneira:

  > respostas<-rbind(c(1,0,1,0,1), c(NA,1,0,NA,1))
  > respostas

       [,1] [,2] [,3] [,4] [,5]
  [1,]    1    0    1    0    1
  [2,]   NA    1    0   NA    1

Aqui o objeto respostas é uma matriz. Observe ainda que existem missings nas respostas fornecidas.

  > factor.scores(fit2, resp.patterns = respostas)

  Call:
  ltm(formula = LSAT ~ z1)
  
  Scoring Method: Empirical Bayes
  
  Factor-Scores for specified response patterns:
    Item 1 Item 2 Item 3 Item 4 Item 5 Obs     Exp     z1
  1      1      0      1      0      1  28  24.989 -0.373
  2     NA      1      0     NA      1   0 249.424 -0.170
    se.z1
  1 0.815
  2 0.859

Observe que o erro padrão da estimativas das proficiências é relativamente alto e que o respondente 2 apesar de não ter apresentado duas respostas, apresentou uma proficiência maior.

3.2 Questionário sobre Altura (Antigo)

O instrumento de medida apresentado na tabela 3.1 refere-se ao questionário sobre Altura com 27 itens.



Tabela 3.1: Questionário com item para investigar a altura de pessoas.


ItemDescrição (pergunta)


1 Ao ficar deitado(a) e esticado(a) em uma cama, meus pés ficam fora do colchão?


2 Sou capaz de pegar um objeto no alto de um armário, com meus pés no chão?


3 Eu preciso abaixar quando vou passar por uma porta?


4 Quando vou dirigir um carro após outra pessoa utilizar, normalmente ajusto o banco para trás?


5 Quando vou dirigir um carro após outra pessoa utilizar, normalmente ajusto o banco para frente?


6 Tenho dificuldade para me acomodar (ajustar) no banco do ônibus?


7 Quando fico de pé no ônibus sinto-me com mais segurança se seguro somente
no pegador superior do ônibus?


8 Quando fico de pé no ônibus sinto-me com mais segurança se seguro somente no pegador dos bancos?


9 Tenho dificuldade de alcançar a cordinha de solicitação de parada do ônibus?


10 Em uma fila, por ordem crescente de tamanho, sou colocado no inicio?


11 Quando compro uma calça, geralmente tenho que fazer a bainha?


12 Ao sentar corretamente na cadeira, consigo colocar o calcanhar no chão?


13 Eu literalmente olho para meus colegas de cima para baixo?


14 No supermercado, tenho dificuldades de alcançar ou visualizar produtos na última prateleira?


15 Quando ando de bicicleta ajusto a altura do banco para baixo?


16 Tenho dificuldade para retirar a bagagem do bagageiro superior do ônibus?


17 Quando eu e várias pessoas vamos tirar fotos, formando três colunas, onde ninguém ficará agachado,
costumo ficar na frente?


18 Se eu e várias pessoas vamos tirar fotos, formando-se três colunas, onde ninguém ficará agachado,
costumo ficar no meio?


19 Em um lugar como uma sala de aula para ver o(a) professor(a) com clareza tenho de sentar-me
na frente das outras pessoas, se não tenho a visão bloqueada por elas?


20 Em uma trave de futebol de campo alcanço a trave superior sem pular?


21 Em meio a uma multidão consigo avistar pessoas distantes de mim?


22 Ao sentar em uma cadeira escolar eu fico desconfortável (incomodado)?


23 Ao ficar na soleira da porta eu consigo colocar a palma da mão na batente da porta?


24 Consigo alcançar facilmente o chuveiro elétrico para mudar a temperatura?


25 Preciso pular para tocar com as pontas dos dedos na batente da porta?


26 Em um telefone público, para visualizar o visor digital preciso inclinar a cabeça?


27 Eu acho que me daria bem em um time de basquete?


28 Qual a sua altura em metros?

3.2.1 Leitura do arquivo

Os dados podem ser obtidos diretamente do site com os seguinte comandos:

  > altura<-read.fwf('http://www.ufpr.br/~aanjos/TRI/dados/altura.dat',widths=c(4,rep(1,27)),
  + header=FALSE,na.strings=9)[-c(1,2),]

A função read.fwf() lê o arquivo considerando as 4 primeiras colunas como identificadores e cada uma das colunas seguinte como sendo um item.

  > head(altura)

      V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16
  3 0001  0  0  0  0  0  0  1  1   1   1   0   1   0   1   1
  4 0002  0  1  0  1  1  0  1  1   1   0   1   1   1   1   1
  5 0003  1  0  0  0  0  0  0  0   1   1   1   1   0   1   1
  6 0004  0  0  0  0  1  0  0  0   1   1   0   1   0   1   1
  7 0005  0  1  0  0  0  1  1  1   1   1   0   1   0   1   1
  8 0006  0  0  0  0  0  0  0  0   1   0   0   1   0   0   1
    V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28
  3   1   1   1   0   0   0   0   0   0   0   0   0
  4   1   1   0   1   1   1   0   1   1   1   0   0
  5   1   1   1   1   1   1   0   0   1   1   0   0
  6   1   1   1   1   0  NA   1   1   1   1   0   0
  7   1   1   1   1   0   1   1   1   1   1   0   1
  8   0   0   0   0   0   0   0   0  NA   0   0   1

Os dados necessitam ser formatados para que possam ser analisados no R. A função colnames() pode ser utilizada para colocar nomes nas colunas (itens):

  > colnames(altura)<-c('id',paste('i',1:27,sep="")) # insere nomes
  > head(altura)

      id i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12 i13 i14 i15
  3 0001  0  0  0  0  0  0  1  1  1   1   0   1   0   1   1
  4 0002  0  1  0  1  1  0  1  1  1   0   1   1   1   1   1
  5 0003  1  0  0  0  0  0  0  0  1   1   1   1   0   1   1
  6 0004  0  0  0  0  1  0  0  0  1   1   0   1   0   1   1
  7 0005  0  1  0  0  0  1  1  1  1   1   0   1   0   1   1
  8 0006  0  0  0  0  0  0  0  0  1   0   0   1   0   0   1
    i16 i17 i18 i19 i20 i21 i22 i23 i24 i25 i26 i27
  3   1   1   1   0   0   0   0   0   0   0   0   0
  4   1   1   0   1   1   1   0   1   1   1   0   0
  5   1   1   1   1   1   1   0   0   1   1   0   0
  6   1   1   1   1   0  NA   1   1   1   1   0   0
  7   1   1   1   1   0   1   1   1   1   1   0   1
  8   0   0   0   0   0   0   0   0  NA   0   0   1

  > class(altura)

  [1] "data.frame"

Observe que existem respostas ausentes (NA’s).

3.2.2 Ajuste do modelo com dois parâmetros

No R o ajuste de modelos com dois parâmetros pode ser realizado com a função ltm(). Deve-se redefinir o argumento constraint para que o parâmetro c seja zero. Nessa opção, no exemplo const=cbind(1:27,1,0), indica que para os 27 itens (1:27), o parâmetro c (1) será definido como 0 (0).

  > altura.tpm<-tpm(altura[,2:28],const=cbind(1:27,1,0))
  > altura.tpm

  Call:
  tpm(data = altura[, 2:28], constraint = cbind(1:27, 1, 0))
  
  Coefficients:
       Gussng  Dffclt  Dscrmn
  i1        0   1.403   1.628
  i2        0   0.022   2.656
  i3        0   3.456   1.626
  i4        0   0.303   2.915
  i5        0  -0.026   2.377
  i6        0   0.827   1.614
  i7        0   0.511   1.352
  i8        0  -0.164   1.821
  i9        0  -1.378   3.518
  i10       0  -0.987   1.391
  i11       0   0.291   1.615
  i12       0  -1.690   1.487
  i13       0   1.192   1.462
  i14       0  -0.991   3.517
  i15       0  -0.969   1.633
  i16       0  -1.062   3.694
  i17       0  -0.769   3.069
  i18       0  -0.243  -0.322
  i19       0  -0.778   2.336
  i20       0   0.676   1.891
  i21       0   0.007   1.672
  i22       0   0.450   0.928
  i23       0  -0.233   2.375
  i24       0  -0.391   2.738
  i25       0  -0.596   2.969
  i26       0   2.461   0.531
  i27       0   1.095   1.551
  
  Log.Lik: -4453.647

Para obter os valores de θ basta aplicar a função factor.scores() sobre o objeto altura.tpm:

  > altura.prof<-factor.scores(altura.tpm)
  > head(altura.prof$score)

    i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12 i13 i14 i15 i16
  1  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0
  2  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0
  3  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0
  4  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0
  5  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0
  6  0  0  0  0  0  0  0  0  0   0   0   0   0   0   0   0
    i17 i18 i19 i20 i21 i22 i23 i24 i25 i26 i27 Obs   Exp
  1   0   0   0   0   0   0   0   0   0   0   0   1 1.956
  2   0   0   0   0   0   0   0   0   0   1   0   2 0.169
  3   0   0   0   0   0   0   1   0   0   1   0   1 0.003
  4   0   0   0   0   0   1   0   0   0   1   0   2 0.017
  5   0   0   0   0   1   0   0   0   0   0   0   1 0.064
  6   0   1   0   0   0   0   0   0   0   0   0   1 3.725
           z1     se.z1
  1 -2.038723 0.4423308
  2 -1.943124 0.4071593
  3 -1.644843 0.3126753
  4 -1.807225 0.3606022
  5 -1.780174 0.3519735
  6 -2.105405 0.4675565

As curvas características dos itens podem ser obtidas da seguinte maneira:



Figura 3.6: Curva característica dos itens para os dados sobre altura.
  > plot(altura.tpm,item=1:14,sub='Altura antigo',legend=F)

PIC


Outras curvas também podem ser obtidas com os seguintes comandos:



Figura 3.7: Curva característica dos itens sobre altura.
  > par(mfrow=c(2,2))
  > plot(altura.tpm,items=1:5)
  > plot(altura.tpm,type="IIC",items=1:5)
  > plot(altura.tpm,type="IIC",items=0)
  > par(mfrow=c(1,1))

PIC


3.2.2.1 Análise pelo pacote irtoys

O modelo com dois parâmetros também pode ser obtido com a função est() do pacote irtoys. Essa função apresenta mais opções do que a apresentada no pacote ltm mas utiliza recursos do pacote ltm.

Dentre as opções está a possibilidade de definir a utilização ou não de prioris para estimação dos parâmetros.

  > altura.par<-est(altura[,2:28], model = "2PL", engine = "ltm", nqp = 20, est.distr = FALSE,
  +   logistic = TRUE, nch = 5, a.prior = TRUE, b.prior = FALSE, c.prior = FALSE,
  +   bilog.defaults = TRUE, rasch = FALSE, run.name = "alturaR")

O objeto altura.par contém os resultados da função est aplicada sobre os dados de altura. Nesse objeto são armazenados os resultados da calibração.

  > altura.par

            [,1]       [,2] [,3]
  i1   1.5142644  1.3457424    0
  i2   2.4924752 -0.1302659    0
  i3   1.5684216  3.4542455    0
  i4   2.6808932  0.1698579    0
  i5   2.2008504 -0.1849514    0
  i6   1.5196265  0.7272339    0
  i7   1.2968491  0.3847169    0
  i8   1.6926909 -0.3311689    0
  i9   3.4285136 -1.5996636    0
  i10  1.3257223 -1.1939416    0
  i11  1.5139391  0.1550446    0
  i12  1.4120046 -1.9345432    0
  i13  1.4042859  1.0991091    0
  i14  3.3658847 -1.2103012    0
  i15  1.5575607 -1.1805861    0
  i16  3.5472831 -1.2811396    0
  i17  2.9670529 -0.9736015    0
  i18 -0.3181647 -0.3970970    0
  i19  2.2253017 -0.9817770    0
  i20  1.7724264  0.5675183    0
  i21  1.6110298 -0.1453534    0
  i22  0.8659072  0.3264545    0
  i23  2.2285484 -0.4065471    0
  i24  2.5506268 -0.5760987    0
  i25  2.7831521 -0.7965415    0
  i26  0.5111392  2.4105038    0
  i27  1.4494248  1.0143558    0

Os valores da proficiência (θ) para cada um dos indivíduos pode ser obtido com a função eap().

  > altura.sco<-eap(altura[,2:28],altura.par,qu=normal.qu())

  > head(altura.sco)

              est       sem  n
  [1,] -0.7784428 0.2793523 27
  [2,]  0.8096109 0.3445628 27
  [3,] -0.1314184 0.2667522 27
  [4,] -0.1584988 0.2789522 26
  [5,]  0.3410517 0.3121063 27
  [6,] -1.4910273 0.2984915 26

3.2.2.2 Obtendo a altura

Por exemplo, pode-se agora, obter a altura de uma pessoa em função das respostas ao questionário.

Um padrão de respostas poderia ser informado da seguinte maneira:

  > resposta<-c(1,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,1)

Estima-se a proficiência de cada pessoa dado o seu padrão de respostas:

  > theta.resposta<-eap(resposta, altura.par,qu=normal.qu());theta.resposta

            est       sem  n
  [1,] -1.00138 0.2537782 27

Capítulo 4
Equalização

4.1 Equalização

A equalização de testes de diferentes grupos pode ser realizada com a função plink() do pacote de mesmo nome.

A equalização envolve um arranjo dos itens que permita que a equalização entre os diferentes grupos seja realizada.

4.1.1 Explicando o exemplo do pacote

Inicialmente carregue o pacote plink:

  > library(plink)

Nesse exemplo, será utilizado o conjunto de dados disponível no pacote plink chamado KB04.

  > data(KB04)

Para mais informações sobre esses dados digite ?KB04.

Basicamente esse dataset consiste em dois testes. O grupo X que representa o novo teste e o grupo Y que representa o teste antigo (referência).

Os testes possuem 36 itens que foram analisados de acordo com um modelo de 3 parâmetros.

Dentro de KB04 são apresentados os itens comuns entre os dois testes.

  > KB04$commom

  NULL

Para fazer a equalização, é necessário preparar os dados para que sejam utilizados na função plink().

O objetivo é colocar os parâmetros estimados do teste X na escala do teste Y.

A função as.poly.mod cria um objeto com o número de itens para serem analisados. Por default é criado um objeto para itens dicotômicos.

  > pm <- as.poly.mod(36)
  > pm

  An object of class "poly.mod"
  Slot "model":
  [1] "drm"
  
  Slot "items":
  $drm
   [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18
  [19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

O objeto x será criado para inserir os parâmetros dos itens já estimados para cada teste.

O argumento cat=list(rep(2,36),rep(2,36)) especifica que o grupo 2 será o grupo de referência.

O arqumento poly.mod=list(pm,pm) define o modelo e o número de itens em cada teste.

O argumento exclude=list(27,NA) exclui o item 27 da lista de itens comuns.

  > x <- as.irt.pars(KB04$pars, KB04$common, cat=list(rep(2,36),rep(2,36)),
  + poly.mod=list(pm,pm), exclude=list(27,NA))

Agora, o objeto x contém a configuração necessária para a realização da equalização.

  > summary(x)

  -------- group1 --------
  Total Number of Items: 36
  
  Number of Dichotomous Items: 36
  Dichotomous Model: 3PL
  
  Number of Polytomous Items: 0
  
  -------- group2 --------
  Total Number of Items: 36
  
  Number of Dichotomous Items: 36
  Dichotomous Model: 3PL
  
  Number of Polytomous Items: 0

A função plink() aplicado sobre o objteo x permite realizar a equalização dos dois testes utilizando vários procedimentos.

Nesse exemplo, utilizou-se o método Mean/Sigma para a equalização.

  > out <- plink(x, rescale="MS", base.grp=2, D=1.7)
  > out

  $link
  An object of class "link"
  Slot "constants":
  $MM
          A         B
   1.217266 -0.557155
  
  $MS
          A         B
   1.168892 -0.515543
  
  $HB
          A         B
   1.092919 -0.457488
  
  $SL
          A         B
   1.101547 -0.476496
  
  
  Slot "descriptives":
  $drm
                     a         b         c
  N Pars:    12.000000 12.000000 12.000000
  Mean: To    0.793383  0.489967  0.151050
  Mean: From  0.965758  0.860225  0.159475
  SD: To      0.283717  1.245828  0.073638
  SD: From    0.446430  1.065820  0.070702
  
  $all
                     a         b         c
  N Pars:    12.000000 12.000000 12.000000
  Mean: To    0.793383  0.489967  0.151050
  Mean: From  0.965758  0.860225  0.159475
  SD: To      0.283717  1.245828  0.073638
  SD: From    0.446430  1.065820  0.070702
  
  
  Slot "iterations":
  HB SL
  12  7
  
  Slot "objective":
           HB          SL
  0.000768951 0.009614059
  
  Slot "convergence":
                          HB                         SL
  "relative convergence (4)" "relative convergence (4)"
  
  Slot "base.grp":
  [1] 2
  
  Slot "n":
   Total Dichot   Poly
      12     12      0
  
  Slot "grp.names":
  [1] "group1/group2*"
  
  Slot "mod.lab":
  [1] "3PL"
  
  Slot "dilation":
  [1] "N/A"
  
  
  $pars
  An object of class "irt.pars"
  Slot "pars":
  $group1
             [,1]        [,2]   [,3]
   [1,] 0.4701889 -2.61487303 0.1751
   [2,] 0.6750838 -1.07614360 0.1165
   [3,] 0.3893431 -1.34557321 0.2087
   [4,] 1.2356146  0.04938250 0.2826
   [5,] 0.8332677 -0.71191686 0.2625
   [6,] 0.4995329 -1.51693278 0.2038
   [7,] 0.7360817  0.01583530 0.3224
   [8,] 0.9791324 -0.66761585 0.2209
   [9,] 0.6453975 -0.49076249 0.1600
  [10,] 0.7845036  0.66959660 0.3648
  [11,] 0.8206062  0.32816325 0.2399
  [12,] 0.5674605 -0.45639706 0.1240
  [13,] 1.0543318 -0.02846570 0.2535
  [14,] 0.8976022  0.40577767 0.1569
  [15,] 0.9145413  0.60776221 0.2986
  [16,] 0.7864713  0.19736423 0.2521
  [17,] 0.7643991  0.08386482 0.2273
  [18,] 0.8274503 -0.28760906 0.0535
  [19,] 0.5613863 -0.05347999 0.1201
  [20,] 0.9030774  0.59268351 0.2036
  [21,] 0.2976323  2.14579031 0.1489
  [22,] 0.7213669  0.72359941 0.2332
  [23,] 0.9532104  0.16545348 0.0644
  [24,] 1.2472495  0.68151930 0.2453
  [25,] 0.4394760  1.09635907 0.1427
  [26,] 0.7865568  0.74475635 0.0879
  [27,] 1.6093018  1.12815293 0.1992
  [28,] 1.2871163  1.24866570 0.1642
  [29,] 0.8267659  1.28957692 0.1431
  [30,] 0.6005687  2.10289197 0.0853
  [31,] 1.0823070  1.67718150 0.2443
  [32,] 0.7329163  1.48793789 0.0865
  [33,] 1.2045595  1.30278540 0.0789
  [34,] 0.4968808  3.54378514 0.1399
  [35,] 0.7919466  3.13163382 0.1090
  [36,] 1.1115655  2.00797794 0.1075
  
  $group2
          [,1]    [,2]   [,3]
   [1,] 0.8704 -1.4507 0.1576
   [2,] 0.4628 -0.4070 0.1094
   [3,] 0.4416 -1.3349 0.1559
   [4,] 0.5448 -0.9017 0.1381
   [5,] 0.6200 -1.4865 0.2114
   [6,] 0.5730 -1.3210 0.1913
   [7,] 1.1752  0.0691 0.2947
   [8,] 0.4450  0.2324 0.2723
   [9,] 0.5987 -0.7098 0.1177
  [10,] 0.8479 -0.4253 0.1445
  [11,] 1.0320 -0.8184 0.0936
  [12,] 0.6041 -0.3539 0.0818
  [13,] 0.8297 -0.0191 0.1283
  [14,] 0.7252 -0.3155 0.0854
  [15,] 0.9902  0.5320 0.3024
  [16,] 0.7749  0.5394 0.2179
  [17,] 0.5942  0.8987 0.2299
  [18,] 0.8081 -0.1156 0.0648
  [19,] 0.9640 -0.1948 0.1633
  [20,] 0.7836  0.3506 0.1299
  [21,] 0.4140  2.5538 0.2410
  [22,] 0.7618 -0.1581 0.1137
  [23,] 1.1959  0.5056 0.2397
  [24,] 1.3554  0.5811 0.2243
  [25,] 1.1869  0.6229 0.2577
  [26,] 1.0296  0.3898 0.1856
  [27,] 1.0417  0.9392 0.1651
  [28,] 1.2055  1.1350 0.2323
  [29,] 0.9697  0.6976 0.1070
  [30,] 0.6336  1.8960 0.0794
  [31,] 1.0822  1.3864 0.1855
  [32,] 1.0195  0.9197 0.1027
  [33,] 1.1347  1.0790 0.0630
  [34,] 1.1948  1.8411 0.0999
  [35,] 1.1961  2.0297 0.0832
  [36,] 0.9255  2.1337 0.1259
  
  
  Slot "cat":
  $group1
   [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
  [29] 2 2 2 2 2 2 2 2
  
  $group2
   [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
  [29] 2 2 2 2 2 2 2 2
  
  
  Slot "poly.mod":
  $group1
  An object of class "poly.mod"
  Slot "model":
  [1] "drm"
  
  Slot "items":
  $drm
   [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18
  [19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
  
  
  
  $group2
  An object of class "poly.mod"
  Slot "model":
  [1] "drm"
  
  Slot "items":
  $drm
   [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18
  [19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
  
  
  
  
  Slot "common":
        group1 group2
   [1,]      3      3
   [2,]      6      6
   [3,]      9      9
   [4,]     12     12
   [5,]     15     15
   [6,]     18     18
   [7,]     21     21
   [8,]     24     24
   [9,]     27     27
  [10,]     30     30
  [11,]     33     33
  [12,]     36     36
  
  Slot "location":
  [1] FALSE FALSE
  
  Slot "groups":
  [1] 2
  
  Slot "dimensions":
  [1] 1 1

Mais detalhes podem ser obtidos com a função summary().

  > summary(out, descrip=TRUE)

  -------  group1/group2*  -------
  Linking Constants
  
                       A         B
  Mean/Mean     1.217266 -0.557155
  Mean/Sigma    1.168892 -0.515543
  Haebara       1.092919 -0.457488
  Stocking-Lord 1.101547 -0.476496
  
  Common Item Descriptive Statistics
  
  Model: 3PL
  Number of Items: 12
  
                     a         b         c
  N Pars:    12.000000 12.000000 12.000000
  Mean: To    0.793383  0.489967  0.151050
  Mean: From  0.965758  0.860225  0.159475
  SD: To      0.283717  1.245828  0.073638
  SD: From    0.446430  1.065820  0.070702

Os novos parâmetros (reescaldos) podem ser obtidos da seguinte forma:

  > pars.out <- link.pars(out)
  > pars.out

  $group1
             [,1]        [,2]   [,3]
   [1,] 0.4701889 -2.61487303 0.1751
   [2,] 0.6750838 -1.07614360 0.1165
   [3,] 0.3893431 -1.34557321 0.2087
   [4,] 1.2356146  0.04938250 0.2826
   [5,] 0.8332677 -0.71191686 0.2625
   [6,] 0.4995329 -1.51693278 0.2038
   [7,] 0.7360817  0.01583530 0.3224
   [8,] 0.9791324 -0.66761585 0.2209
   [9,] 0.6453975 -0.49076249 0.1600
  [10,] 0.7845036  0.66959660 0.3648
  [11,] 0.8206062  0.32816325 0.2399
  [12,] 0.5674605 -0.45639706 0.1240
  [13,] 1.0543318 -0.02846570 0.2535
  [14,] 0.8976022  0.40577767 0.1569
  [15,] 0.9145413  0.60776221 0.2986
  [16,] 0.7864713  0.19736423 0.2521
  [17,] 0.7643991  0.08386482 0.2273
  [18,] 0.8274503 -0.28760906 0.0535
  [19,] 0.5613863 -0.05347999 0.1201
  [20,] 0.9030774  0.59268351 0.2036
  [21,] 0.2976323  2.14579031 0.1489
  [22,] 0.7213669  0.72359941 0.2332
  [23,] 0.9532104  0.16545348 0.0644
  [24,] 1.2472495  0.68151930 0.2453
  [25,] 0.4394760  1.09635907 0.1427
  [26,] 0.7865568  0.74475635 0.0879
  [27,] 1.6093018  1.12815293 0.1992
  [28,] 1.2871163  1.24866570 0.1642
  [29,] 0.8267659  1.28957692 0.1431
  [30,] 0.6005687  2.10289197 0.0853
  [31,] 1.0823070  1.67718150 0.2443
  [32,] 0.7329163  1.48793789 0.0865
  [33,] 1.2045595  1.30278540 0.0789
  [34,] 0.4968808  3.54378514 0.1399
  [35,] 0.7919466  3.13163382 0.1090
  [36,] 1.1115655  2.00797794 0.1075
  
  $group2
          [,1]    [,2]   [,3]
   [1,] 0.8704 -1.4507 0.1576
   [2,] 0.4628 -0.4070 0.1094
   [3,] 0.4416 -1.3349 0.1559
   [4,] 0.5448 -0.9017 0.1381
   [5,] 0.6200 -1.4865 0.2114
   [6,] 0.5730 -1.3210 0.1913
   [7,] 1.1752  0.0691 0.2947
   [8,] 0.4450  0.2324 0.2723
   [9,] 0.5987 -0.7098 0.1177
  [10,] 0.8479 -0.4253 0.1445
  [11,] 1.0320 -0.8184 0.0936
  [12,] 0.6041 -0.3539 0.0818
  [13,] 0.8297 -0.0191 0.1283
  [14,] 0.7252 -0.3155 0.0854
  [15,] 0.9902  0.5320 0.3024
  [16,] 0.7749  0.5394 0.2179
  [17,] 0.5942  0.8987 0.2299
  [18,] 0.8081 -0.1156 0.0648
  [19,] 0.9640 -0.1948 0.1633
  [20,] 0.7836  0.3506 0.1299
  [21,] 0.4140  2.5538 0.2410
  [22,] 0.7618 -0.1581 0.1137
  [23,] 1.1959  0.5056 0.2397
  [24,] 1.3554  0.5811 0.2243
  [25,] 1.1869  0.6229 0.2577
  [26,] 1.0296  0.3898 0.1856
  [27,] 1.0417  0.9392 0.1651
  [28,] 1.2055  1.1350 0.2323
  [29,] 0.9697  0.6976 0.1070
  [30,] 0.6336  1.8960 0.0794
  [31,] 1.0822  1.3864 0.1855
  [32,] 1.0195  0.9197 0.1027
  [33,] 1.1347  1.0790 0.0630
  [34,] 1.1948  1.8411 0.0999
  [35,] 1.1961  2.0297 0.0832
  [36,] 0.9255  2.1337 0.1259

Capítulo 5
Simulação de respostas no R

5.1 Simulação de respostas utilizando o pacote irtoys

Primeiro carregue o pacote irtoys no R:

  > require(irtoys)

5.1.0.1 Modelo de 3 parâmetros

Em seguida, deve-se definir os valores dos parâmetros e o número de itens. Considere, por exemplo 45 itens para uma prova.

O parâmetro de discriminação a será simulado a partir de uma Distribuição Uniforme variando de 0,2 até 3 com a utilização da função runif(). Para cada simulação, deve-se definir uma semente para que o resultado da simulação possa ser repetido.

  > set.seed(2345) # semente
  > a<-runif(45,.2,3) # 18 variando no intervalo 0,2 até 3

O parâmetro de dificuldade b será simulado considerando uma sequência de 18 números equidistantes que vai de -2 até 2 utilizando-se a função seq().

  > b<-seq(-2,2,length=45)

O parâmetro c pode também, ser baseado em uma distribuição uniforme ou em valores conhecidos a priori.

  > set.seed(321)
  > #c<-runif(45,.10,.25) ou
  > c<-rep(.25,45)

Os valores simulados podem ser agrupados em um data.frame() da seguinte maneira:

  > pa<-cbind(a,b,c);pa

                a           b    c
   [1,] 0.5268817 -2.00000000 0.25
   [2,] 0.7460703 -1.90909091 0.25
   [3,] 2.1840811 -1.81818182 0.25
   [4,] 0.2964729 -1.72727273 0.25
   [5,] 1.5303363 -1.63636364 0.25
   [6,] 1.0236516 -1.54545455 0.25
   [7,] 1.8930629 -1.45454545 0.25
   [8,] 2.4077543 -1.36363636 0.25
   [9,] 1.3403296 -1.27272727 0.25
  [10,] 2.1934367 -1.18181818 0.25
  [11,] 0.6460858 -1.09090909 0.25
  [12,] 1.1592440 -1.00000000 0.25
  [13,] 0.4269729 -0.90909091 0.25
  [14,] 0.6198062 -0.81818182 0.25
  [15,] 1.3493747 -0.72727273 0.25
  [16,] 1.1250785 -0.63636364 0.25
  [17,] 1.9192593 -0.54545455 0.25
  [18,] 1.4157916 -0.45454545 0.25
  [19,] 2.0906209 -0.36363636 0.25
  [20,] 0.7286267 -0.27272727 0.25
  [21,] 2.9442165 -0.18181818 0.25
  [22,] 1.5851195 -0.09090909 0.25
  [23,] 2.4922230  0.00000000 0.25
  [24,] 1.6097531  0.09090909 0.25
  [25,] 1.1813937  0.18181818 0.25
  [26,] 0.5926241  0.27272727 0.25
  [27,] 2.6995558  0.36363636 0.25
  [28,] 1.9058324  0.45454545 0.25
  [29,] 1.8190562  0.54545455 0.25
  [30,] 2.6080916  0.63636364 0.25
  [31,] 0.6709691  0.72727273 0.25
  [32,] 1.6447777  0.81818182 0.25
  [33,] 2.9040783  0.90909091 0.25
  [34,] 1.8625741  1.00000000 0.25
  [35,] 0.3790259  1.09090909 0.25
  [36,] 2.5376286  1.18181818 0.25
  [37,] 1.7859149  1.27272727 0.25
  [38,] 2.2143143  1.36363636 0.25
  [39,] 0.4648870  1.45454545 0.25
  [40,] 1.7959496  1.54545455 0.25
  [41,] 2.3558405  1.63636364 0.25
  [42,] 1.7034367  1.72727273 0.25
  [43,] 1.6578749  1.81818182 0.25
  [44,] 2.4340014  1.90909091 0.25
  [45,] 1.0647566  2.00000000 0.25

É necessário também simular a proficiência dos indivíduos que respondem o teste. Por exemplo, pode-se simular a proficiência de 100 pessoas considerando que essa proficiência tenha uma distribuição simétrica. Nesse caso, pode-se utiliza a função rnorm() para gerar 100 valores da distribuição Normal com média 0 e desvio padrão 1.

  > set.seed(1236)
  > pf<-rnorm(100)

No irtoyso padrão de respostas em função dos parâmetros e da habilidade pode ser obtido com a função sim(). É necessário fornecer os valores dos parâmetros dos itens e da proficiência dos indivíduos:

  > dados.sim<-sim(ip=pa,x=pf)

Agora, o objeto dados.sim contém as respostas de indivíduos para cada um dos 45 itens:

  > head(dados.sim)

       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
  [1,]    1    1    1    0    1    0    1    0    1     1
  [2,]    1    1    1    1    1    1    1    1    1     1
  [3,]    1    1    1    1    1    0    1    1    0     1
  [4,]    1    1    1    1    1    0    1    1    1     1
  [5,]    1    1    1    1    1    1    1    1    1     0
  [6,]    0    1    1    1    1    1    1    1    0     1
       [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19]
  [1,]     0     0     0     1     0     1     1     0     1
  [2,]     0     1     1     1     1     1     0     0     0
  [3,]     1     1     1     1     0     1     1     1     1
  [4,]     1     1     1     1     1     1     1     1     1
  [5,]     1     0     0     1     0     0     0     0     1
  [6,]     0     1     1     1     1     1     1     1     1
       [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28]
  [1,]     0     1     1     1     0     0     0     0     1
  [2,]     1     0     0     1     1     1     0     0     1
  [3,]     1     1     1     1     1     1     0     0     0
  [4,]     0     1     1     1     0     1     1     0     1
  [5,]     0     1     0     0     1     0     0     0     1
  [6,]     0     1     0     1     1     1     0     0     1
       [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37]
  [1,]     0     1     0     1     0     0     1     0     0
  [2,]     1     0     1     0     0     1     0     0     0
  [3,]     0     0     1     0     0     0     0     1     0
  [4,]     1     1     1     1     0     0     0     1     1
  [5,]     0     1     0     1     1     0     1     0     0
  [6,]     0     1     0     0     1     1     1     0     1
       [,38] [,39] [,40] [,41] [,42] [,43] [,44] [,45]
  [1,]     1     0     0     1     0     1     0     0
  [2,]     1     0     0     0     0     0     1     0
  [3,]     0     1     0     0     0     0     1     1
  [4,]     1     0     1     1     0     1     0     1
  [5,]     1     1     0     1     0     1     1     1
  [6,]     1     0     0     0     0     0     0     0

Para o padrão de resposta simulado pode-se obter as estimativas dos parâmetros de um modelo com 3 parâmetros. Inicialmente, considere que o valor do parâmetro c é conhecido e não será estimado:

  > dados.tpm<-tpm(dados.sim,constraint = cbind(1:45, 1, 0.25))
  > coef(dados.tpm)

          Gussng      Dffclt     Dscrmn
  Item 1    0.25 -3.28798667  0.2302528
  Item 2    0.25 -3.78349488  0.3734885
  Item 3    0.25 -2.34243980  1.9267562
  Item 4    0.25 -0.92571068  0.4536274
  Item 5    0.25 -2.95639352  0.9287898
  Item 6    0.25 -4.74323848  0.3150632
  Item 7    0.25 -2.19298252  1.4451862
  Item 8    0.25 -1.73222959  1.7451602
  Item 9    0.25 -1.93001622  0.8557002
  Item 10   0.25 -1.74960312  1.1508307
  Item 11   0.25 -3.41767353  0.2398914
  Item 12   0.25 -0.96068699  1.2406259
  Item 13   0.25  0.09195059  0.7716867
  Item 14   0.25 -0.75905279  0.4743860
  Item 15   0.25 -1.25124820  0.6375638
  Item 16   0.25 -0.49864753  2.0606970
  Item 17   0.25 -0.81917176  2.0854593
  Item 18   0.25 -0.73545429  1.9269148
  Item 19   0.25 -0.65155378  2.1591340
  Item 20   0.25 -0.76858131  0.7102104
  Item 21   0.25 -0.55369615  2.1217386
  Item 22   0.25  0.03176358  1.9895461
  Item 23   0.25 -0.44477299  1.0267255
  Item 24   0.25 -0.01583068  1.0268666
  Item 25   0.25 -1.44699674  0.3648399
  Item 26   0.25  0.47706206  0.2950440
  Item 27   0.25  0.34092609  2.8920909
  Item 28   0.25  0.42136136  2.0028785
  Item 29   0.25  0.38655641  1.3204478
  Item 30   0.25  0.37031584  2.4685426
  Item 31   0.25  0.45842906  0.3177321
  Item 32   0.25  0.91099531  4.2147073
  Item 33   0.25  0.78250455  1.8035687
  Item 34   0.25  1.20499213  1.4873402
  Item 35   0.25  2.88481569  0.1427868
  Item 36   0.25  0.96439724  2.2189871
  Item 37   0.25  1.16859471  2.8674330
  Item 38   0.25  2.63983974  1.0145229
  Item 39   0.25  3.06949430  0.5206913
  Item 40   0.25  1.41856503 13.5535676
  Item 41   0.25  2.00736597  2.7652004
  Item 42   0.25  2.45435751  1.0414293
  Item 43   0.25  1.67909799  1.1207585
  Item 44   0.25  1.43169095 16.3478356
  Item 45   0.25  2.40623168  0.7782586

Agora, pode-se sugerir que a função estime os valores de c, sem especificar constraint.

  > dados.tpm<-tpm(dados.sim)
  > coef(dados.tpm)

                Gussng        Dffclt     Dscrmn
  Item 1  9.052602e-02 -8.7742734733  0.1176229
  Item 2  1.729969e-01 -8.4240831822  0.1803861
  Item 3  8.999983e-01 -0.4438178090  7.5205927
  Item 4  8.004538e-04 -1.6468225866  0.5511815
  Item 5  8.285002e-01 -0.4038086295  3.0836119
  Item 6  4.648995e-02 -4.4744530119  0.4065744
  Item 7  1.781231e-03 -2.2548815119  1.6828047
  Item 8  1.162021e-03 -1.8164945165  2.0712340
  Item 9  7.852773e-01  0.3624605610  4.4505597
  Item 10 4.876221e-01 -0.9626547763  1.7462417
  Item 11 1.139315e-01 -7.8625563526  0.1341460
  Item 12 4.324137e-04 -1.2590819921  1.3513557
  Item 13 5.588192e-01  0.7564826573 23.6236300
  Item 14 1.251107e-02 -1.6860562328  0.4931435
  Item 15 6.172156e-01  0.4028200022  1.8882868
  Item 16 4.165041e-01 -0.1153130177  3.7142935
  Item 17 3.820688e-01 -0.4720170632  3.7882500
  Item 18 4.861269e-05 -0.9031401375  2.2659264
  Item 19 4.639934e-01 -0.0338145877 30.1324362
  Item 20 6.381104e-01  0.6546170586 10.0333505
  Item 21 4.808539e-01 -0.0312975539 11.2276259
  Item 22 4.235198e-01  0.3531125111  3.3411774
  Item 23 5.062933e-01  0.3521810951  1.7122403
  Item 24 2.623571e-01  0.0004415927  1.4060786
  Item 25 1.036108e-02 -2.6539049406  0.3624641
  Item 26 1.527668e-02 -1.6614302702  0.2349295
  Item 27 1.406344e-01  0.1197226447  3.1265139
  Item 28 2.455153e-01  0.3420828288  2.4335911
  Item 29 1.405647e-03 -0.2904173219  1.0114117
  Item 30 3.838057e-01  0.6495772446 23.9914040
  Item 31 1.947493e-02 -1.0512013019  0.3739092
  Item 32 2.262465e-01  0.6840847811 16.6283494
  Item 33 2.967957e-01  0.6919972501  3.0660505
  Item 34 9.575056e-04  0.4496197075  0.9081179
  Item 35 2.928483e-01  1.8281901233  0.3069027
  Item 36 3.074958e-01  0.7341491514 19.3405915
  Item 37 2.280059e-01  0.9501304883  2.7616993
  Item 38 2.984605e-01  2.1155337673  2.6669069
  Item 39 3.079240e-01  2.0220163956  1.1615101
  Item 40 1.593238e-04  0.8575168321  1.2914313
  Item 41 2.088056e-01  1.5622466448  2.6318643
  Item 42 9.168379e-04  1.3989259351  0.5650123
  Item 43 2.827395e-01  1.3503905539  1.7585206
  Item 44 2.936567e-01  1.4787752656  6.7905542
  Item 45 2.380154e-04  1.1212501013  0.5313858

5.2 Simulação de respostas utilizando o pacote ltm

No pacote ltm existe a função rmvlogis() para simulação de padrões de resposta dicotômicos para modelos da TRI.

Nesse curso veremos como simular dados considerando respostas dicotômicas para os modelos de 3 e 2 parâmetros e para o modelo Rasch (1 parâmetro).

A função rmvlogis() pode ser utilizada para simular qualquer um dos modelos de 1, 2 e 3 parâmetros. O número de parâmetros depende de como é especificado o argumento theta da função rmvlogis().

O theta pode ser definido de várias maneiras, por exemplo:

1.
modelo de 3 parâmetros:

  > theta3<-cbind(.25,seq(-2,2,1),1)
  > theta3

       [,1] [,2] [,3]
  [1,] 0.25   -2    1
  [2,] 0.25   -1    1
  [3,] 0.25    0    1
  [4,] 0.25    1    1
  [5,] 0.25    2    1
2.
modelo de 2 parâmetros:

  > theta2<-cbind(seq(-2,2,1),runif(5,.8,1.2))
  > theta2

       [,1]      [,2]
  [1,]   -2 0.8839884
  [2,]   -1 1.0127848
  [3,]    0 0.8370904
  [4,]    1 0.8353803
  [5,]    2 1.1993749
3.
modelo de 1 parâmetro:

  > theta1<-cbind(seq(-2,2,1),1)
  > theta1

       [,1] [,2]
  [1,]   -2    1
  [2,]   -1    1
  [3,]    0    1
  [4,]    1    1
  [5,]    2    1

Para simular dados considerando o modelo de Rasch utilize theta1, para um modelo com 2 parâmetros utilize theta2 e para um modelo com 3 parâmetros utilize theta3.

Para um modelo de 3 parâmetros, as respostas de 10 respondentes podem ser fornecidas da seguinte maneira.

  > rmvlogis(10,theta3)

        [,1] [,2] [,3] [,4] [,5]
   [1,]    1    1    1    1    1
   [2,]    1    1    1    1    1
   [3,]    1    1    1    1    1
   [4,]    1    1    1    1    1
   [5,]    1    1    1    1    1
   [6,]    1    1    1    1    1
   [7,]    1    1    1    1    1
   [8,]    1    1    1    1    1
   [9,]    1    1    1    1    1
  [10,]    1    1    1    1    1

Para um modelo de 2 parâmetros, as respostas de 10 respondentes podem ser fornecidas da seguinte maneira.

  > rmvlogis(10,theta2)

        [,1] [,2] [,3] [,4] [,5]
   [1,]    1    1    0    0    0
   [2,]    1    0    0    0    0
   [3,]    1    0    0    0    0
   [4,]    1    1    0    0    0
   [5,]    1    1    0    0    0
   [6,]    1    1    0    0    0
   [7,]    1    0    0    0    0
   [8,]    1    1    1    0    0
   [9,]    1    1    1    1    0
  [10,]    1    0    1    0    1

E Para um modelo de 1 parâmetro, as resposta de 10 respondentes podem ser fornecidas da seguinte maneira.

  > rmvlogis(10,theta1)

        [,1] [,2] [,3] [,4] [,5]
   [1,]    1    1    1    0    0
   [2,]    1    1    1    0    1
   [3,]    1    0    1    0    0
   [4,]    0    1    0    0    0
   [5,]    1    0    1    0    0
   [6,]    1    1    0    0    0
   [7,]    1    1    1    0    0
   [8,]    1    1    0    0    0
   [9,]    1    1    1    0    0
  [10,]    1    0    0    0    0

5.2.1 Uma ilustração de uma simulação

Considere um conjunto de dados simulados com as seguintes características: 37 itens e 600 pessoas.

  > # simulação: 37 itens e 600 pessoas
  > set.seed(12345)
  > a<-runif(37,.2,3)
  > b<-seq(-2.5,2.5,length=37)
  > set.seed(321)
  > c<-rep(.33,37)
  > par<-cbind(a,b,c)
  > set.seed(1236)
  > prof<-rnorm(600)
  > dados<-sim(ip=par,x=prof)
  > head(dados)

       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
  [1,]    1    1    1    1    1    1    1    1    1     1
  [2,]    1    1    1    1    1    1    1    1    1     0
  [3,]    1    1    1    1    1    1    1    1    1     1
  [4,]    1    1    1    1    1    1    1    1    1     1
  [5,]    1    1    0    1    1    1    0    0    1     0
  [6,]    1    1    1    1    1    0    1    1    1     1
       [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19]
  [1,]     1     1     0     1     0     1     1     1     0
  [2,]     1     1     1     1     0     1     1     1     1
  [3,]     1     0     0     0     1     1     1     0     1
  [4,]     1     1     1     1     1     0     1     1     1
  [5,]     0     0     0     0     1     0     0     1     0
  [6,]     1     1     1     0     1     1     1     1     1
       [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28]
  [1,]     0     0     1     0     0     0     1     0     0
  [2,]     1     1     1     1     1     1     0     0     1
  [3,]     1     0     0     0     1     0     0     1     1
  [4,]     1     0     0     1     1     1     1     0     1
  [5,]     1     1     1     1     0     1     1     0     0
  [6,]     1     1     0     1     1     0     1     1     1
       [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37]
  [1,]     0     0     1     1     1     0     1     1     0
  [2,]     1     0     1     0     1     0     1     1     0
  [3,]     1     0     0     1     1     0     0     0     1
  [4,]     1     1     0     0     0     1     0     0     0
  [5,]     1     0     0     1     0     0     0     1     0
  [6,]     0     0     1     1     1     1     0     0     1

Considere a estimação dos parâmetros (calibração) do modelo de 3 parâmetros:

  > # Calibração
  > dados.tpm.orig<-tpm(dados)
  > coef(dados.tpm.orig)

                Gussng      Dffclt       Dscrmn
  Item 1  9.641313e-11 -3.10434604   2.16567298
  Item 2  8.695950e-01 -1.36240309 272.56654706
  Item 3  7.695997e-13 -3.63203751   1.40935443
  Item 4  8.609015e-22 -2.16550248   3.44254445
  Item 5  7.653565e-01 -1.25348063   1.07794192
  Item 6  2.675310e-01 -2.09563157   0.66318169
  Item 7  3.689610e-01 -1.55394347   1.17661795
  Item 8  5.453564e-01 -0.99828788   2.26854925
  Item 9  6.294725e-01 -0.81976273   2.54651893
  Item 10 2.022050e-01 -1.49093109   2.38185646
  Item 11 2.604113e-05 -6.25387460   0.16138347
  Item 12 5.975753e-01  0.60013696   1.10089420
  Item 13 5.001582e-01 -0.37975957   3.58228938
  Item 14 2.159250e-02 -9.31724174   0.07012002
  Item 15 4.066378e-22 -1.43999707   1.03208933
  Item 16 1.841363e-20 -1.13814235   1.13175115
  Item 17 4.849721e-02 -0.93311273   1.15254508
  Item 18 4.461038e-01  0.02250488   1.82544277
  Item 19 6.560358e-19 -1.48563261   0.54625634
  Item 20 3.797071e-01  0.31881971   2.63915084
  Item 21 3.178852e-01  0.29950135   1.14310778
  Item 22 3.559133e-01  0.59644994   1.74279259
  Item 23 2.971388e-01  0.33513149   3.05594541
  Item 24 2.131059e-01  0.40573145   1.33598811
  Item 25 2.929697e-01  0.90535003   2.24502784
  Item 26 2.789134e-01  0.89072747   1.39016184
  Item 27 3.375545e-01  1.27671422   2.88367317
  Item 28 2.942680e-01  0.81341723   1.63106231
  Item 29 3.003283e-01  1.13410591   0.94532039
  Item 30 2.526157e-01  1.28013015   1.42103174
  Item 31 3.367567e-01  1.79369061   2.91533526
  Item 32 5.647896e-01  2.61379908   1.44548165
  Item 33 4.682296e-01  2.06676199  37.61403003
  Item 34 3.449549e-01  2.04288814 134.03117902
  Item 35 2.976267e-01  2.04109179   1.03017467
  Item 36 3.883943e-01  2.25831858  30.59389470
  Item 37 3.377074e-01  2.10377402  42.12306398

Observe que alguns parâmetros não possuem características razoáveis para serem utilizados na estimação da proficiência. Por opção, a análise foi refeita com a exclusão de alguns itens.

  > dados.tpm<-tpm(dados[,-c(2,11,12,13,14,33,34,36,37)])
  > coef(dados.tpm)

                Gussng      Dffclt    Dscrmn
  Item 1  0.0068335682 -3.11998697 2.1396699
  Item 2  0.0050822335 -3.62007467 1.4158115
  Item 3  0.0010572125 -2.12849496 3.7649423
  Item 4  0.7876208652 -1.04330694 1.1748519
  Item 5  0.2860247111 -1.99284554 0.6835474
  Item 6  0.4920945092 -1.15990726 1.3683953
  Item 7  0.5236111599 -1.00938481 2.5092894
  Item 8  0.6875769321 -0.61129096 3.2807777
  Item 9  0.2114626745 -1.57413749 2.0420604
  Item 10 0.0009159927 -1.44631365 1.0269806
  Item 11 0.0011522597 -1.15108842 1.1135984
  Item 12 0.0084612208 -0.98449274 1.1755740
  Item 13 0.4312730615 -0.02475576 1.7656881
  Item 14 0.0042831918 -1.46842566 0.5491925
  Item 15 0.3899496632  0.34475157 2.7745376
  Item 16 0.2756645251  0.15677929 1.0720104
  Item 17 0.3276378895  0.51777440 1.5573919
  Item 18 0.3478276856  0.45195562 4.4512244
  Item 19 0.2261765053  0.43976190 1.3720570
  Item 20 0.2841505885  0.91388472 1.9608839
  Item 21 0.2970548625  0.92692326 1.5293103
  Item 22 0.3301705525  1.25131224 2.6852375
  Item 23 0.2795508058  0.80355737 1.4349381
  Item 24 0.3085922461  1.16579006 0.9651454
  Item 25 0.2888609752  1.31858406 1.8783914
  Item 26 0.3358236370  1.78909163 2.8606387
  Item 27 0.2957530235  2.57668860 0.1368518
  Item 28 0.3125435724  1.89322256 1.2982724



Figura 5.1: Curva característicasstica dos itens.
  > par(mfrow=c(2,2))
  > plot(dados.tpm,item=27)
  > plot(dados.tpm,item=17)
  > plot(dados.tpm)
  > par(mfrow=c(1,1))

PIC


A proficiência pode ser estimada com a função factor.scores():

  > theta<-factor.scores(dados.tpm, method = "EAP", prior = TRUE)
  > head(theta$score.dat$z1,n=100) # 100 observações/indivíduos
    [1] -2.069086447 -1.707089412 -1.636299068 -1.330564487
    [5] -1.137091604 -0.938136089 -1.222910118 -1.333087791
    [9]  1.116942213 -1.350682627 -0.807981402 -1.151613761
   [13]  0.001822315 -2.041948932 -1.333812084 -1.576858719
   [17] -1.940895035 -1.552621372 -1.176233643 -2.043702178
   [21] -2.252464535 -2.727375995 -2.228160026 -1.193095925
   [25] -2.051004042 -2.933389378 -1.437208687 -1.369423914
   [29] -0.504287320 -1.354131663 -0.883199792 -1.354969220
   [33]  0.666957727 -0.529473495 -0.820160103 -0.683897800
   [37]  1.155670986 -1.355184154 -1.159711608 -1.305747181
   [41] -1.232743873 -0.877079944  1.132895490 -1.442117803
   [45] -1.354171066 -0.703589964 -0.742075267  0.246192176
   [49]  0.380220939 -0.907585265  0.656726957 -0.356504322
   [53] -0.687653637 -0.578715880 -0.619630749 -0.143577209
   [57]  0.110097303  0.091261458  0.870166126 -1.927622962
   [61] -0.833587128 -0.988792399 -0.890613300 -0.773356601
   [65] -0.747629761 -1.409747094 -1.012955202 -1.246532305
   [69] -1.030714192 -1.208568406 -1.313664602 -1.281797129
   [73] -1.279362550 -1.089636131 -0.877204074 -0.784307533
   [77] -0.870522997 -0.734855914 -1.294391812 -0.680149696
   [81] -0.110792782 -0.222933158 -1.325464923  0.191329950
   [85] -0.700554862 -0.955063880 -1.074545569 -1.066112763
   [89] -1.154586509 -0.799593355  0.730135597 -0.180687107
   [93]  1.128615319  0.299407213  0.723461251 -0.072488358
   [97] -0.380410845  0.024490558  0.023354257 -0.007764788



Figura 5.2: Gráfico da proficiências.
  > par(mfrow=c(1,1))
  > plot(theta)

PIC




Figura 5.3: Gráfico das proficiências com os itens posicionados.
  > par(mfrow=c(1,1))
  > plot(theta,include.items=T)

PIC


Suponha que 3 pessoas responderam o teste, cada uma com uma proficiência diferente.

  > set.seed(1);A<-rbinom(28,1,.6)
  > set.seed(2);B<-rbinom(28,1,.87)
  > set.seed(3);C<-rbinom(28,1,.9)
  > pessoas<-rbind(A,B,C);pessoas
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
  A    1    1    1    0    1    0    0    0    0     1     1
  B    1    1    1    1    0    0    1    1    1     1     1
  C    1    1    1    1    1    1    1    1    1     1     1
    [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
  A     1     0     1     0     1     0     0     1     0
  B     1     1     1     1     1     0     1     1     1
  C     1     1     1     1     1     1     1     1     1
    [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28]
  A     0     1     0     1     1     1     1     1
  B     1     1     1     1     1     1     1     1
  C     1     1     1     1     1     1     1     0

Estima-se a proficiência de cada pessoa dado o seu padrão de respostas:

  > theta.p<-factor.scores(dados.tpm, method = "EAP", prior = TRUE,resp.patterns=pessoas);theta.p
  Call:
  tpm(data = dados[, -c(2, 11, 12, 13, 14, 33, 34, 36, 37)])
  
  Scoring Method: Expected A Posteriori
  
  Factor-Scores for specified response patterns:
    Item 1 Item 2 Item 3 Item 4 Item 5 Item 6 Item 7 Item 8
  A      1      1      1      0      1      0      0      0
  B      1      1      1      1      0      0      1      1
  C      1      1      1      1      1      1      1      1
    Item 9 Item 10 Item 11 Item 12 Item 13 Item 14 Item 15
  A      0       1       1       1       0       1       0
  B      1       1       1       1       1       1       1
  C      1       1       1       1       1       1       1
    Item 16 Item 17 Item 18 Item 19 Item 20 Item 21 Item 22
  A       1       0       0       1       0       0       1
  B       1       0       1       1       1       1       1
  C       1       1       1       1       1       1       1
    Item 23 Item 24 Item 25 Item 26 Item 27 Item 28 Obs   Exp
  A       0       1       1       1       1       1   0 0.000
  B       1       1       1       1       1       1   0 0.000
  C       1       1       1       1       1       0   1 1.629
        z1 se.z1
  A -1.359 0.190
  B  1.369 0.458
  C  2.158 0.428

Pode-se, a partir daí, posicionar as pessoas na escala de proficiência obtida (5.4):



Figura 5.4: Gráfico das proficiências com os itens e pessoas posicionados.
  > par(mfrow=c(1,1))
  > plot(theta,include.items=T)
  > text(theta.p$score.dat$z1,c(0.05,0.05,0.05),row.names(pessoas),col=2)
  > abline(v=theta.p$score.dat$z1,col=2,lty=2)

PIC