如何将因子分数(Exp)应用于我的数据中的观察?如何将我的数据集中的观察值与基于R中的向量的值进行匹配?

时间:2016-06-01 17:08:42

标签: r vector statistics analytics data-manipulation

我之前见过类似的问题,但我从来没有找到满意的答案。

我正在使用名为ltm的项目响应理论包来分析我的数据。 我的数据(许多科目的25个测试题的二进制答案)如下所示:

q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 q16 q17 q18 q19 q20 q21 q22 q23 q24
0  1  1  0  0  0  1  1  1   1   1   1   1   0   0   1   0   0   0   1   0   1   0   0
1  0  1  0  1  1  1  1  1   0   1   0   0   1   1   1   0   0   0   0   0   1   0   0
1  1  1  0  1  1  1  1  0   1   1   1   1   1   1   1   1   1   1   0   1   0   1   1
1  1  0  0  1  0  1  1  0   0   0   0   0   1   0   0   0   1   0   0   1   0   0   0
0  1  1  1  1  0  1  1  1   1   0   1   0   1   1   1   0   0   1   1   1   1   0   0
0  1  1  1  0  1  1  1  0   1   0   0   1   0   1   1   1   1   1   1   1   1   0   0

接下来我开始分析

library(ltm)
model <- ltm(questionsPretest ~ z1, IRT.param = na.action = NULL)

为了评估每个考生的能力,我运行因子分数:

 scores <- factor.scores(model)

这使我能够为学生提供她的答案(24 1和0)的向量。 能力(称为z1)在分数中存储如下:

str(scores)
List of 6
 $ score.dat:'data.frame':  3088 obs. of  28 variables:
  ..$ q1   : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q2   : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q3   : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q4   : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q5   : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q6   : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q7   : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q8   : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q9   : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q10  : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q11  : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q12  : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q13  : num [1:3088] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ q14  : num [1:3088] 0 0 0 0 0 0 0 0 0 1 ...
  ..$ q15  : num [1:3088] 0 0 0 0 0 0 0 0 1 0 ...
  ..$ q16  : num [1:3088] 0 0 0 0 0 0 0 1 0 0 ...
  ..$ q17  : num [1:3088] 0 0 0 0 0 1 1 1 0 0 ...
  ..$ q18  : num [1:3088] 0 0 0 1 1 0 0 0 0 0 ...
  ..$ q19  : num [1:3088] 0 0 0 0 1 0 0 0 0 0 ...
  ..$ q20  : num [1:3088] 0 0 0 0 0 1 1 0 0 0 ...
  ..$ q21  : num [1:3088] 0 1 1 0 0 0 1 1 0 0 ...
  ..$ q22  : num [1:3088] 0 0 0 1 0 0 0 0 0 0 ...
  ..$ q23  : num [1:3088] 0 0 0 0 0 0 1 0 0 0 ...
  ..$ q24  : num [1:3088] 0 0 1 0 0 0 0 0 0 0 ...
  ..$ Obs  : num [1:3088] 87 1 1 1 1 1 1 1 1 1 ...
  ..$ Exp  : num [1:3088] 5.553 2.275 0.213 0.096 0.061 ...
  ..$ z1   : num [1:3088] -1.9 -1.87 -1.61 -1.55 -1.53 ...
  ..$ se.z1: num [1:3088] 0.573 0.583 0.535 0.523 0.524 ...
 $ method   : chr "EB"
 $ B        : num 5
 $ call     : language tpm(data = questionsPretest, type = "latent.trait",             IRT.param = TRUE, na.action = NULL)
 $ resp.pats: logi FALSE
 $ coef     : num [1:24, 1:3] 0.000017879 0.311805093 0.000045896 0.000000182 0.000004738 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:24] "q1" "q2" "q3" "q4" ...
  .. ..$ : Named chr [1:3] "Gussng" "Dffclt" "Dscrmn"
  .. .. ..- attr(*, "names")= chr [1:3] "Guessing" "Difficulty" "Discrimination"
 - attr(*, "class")= chr "fscores"

我需要做的是根据答案将z1分配给我的数据集中的观察。查看分数的输出,我会将z1 = -1.9分配给所有对所有问题都回答为0的人。我会将z1 = -1.87分配给除问题q21之外的所有问题都回答0的人。

正如你所知,在我的数据集中有3088个观察到的答案排列,所以我真的想避免这样做:)

有人可以建议如何在R中做到吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

假设您有一个data.frame df,其中包含一个名为obsScores的变量,用于标记每个参与者的分数(观察)。

以下是两种分配机制:

蛮力,只需给每个参与者提供原始价值:

df$factorScore <- scores$z1[df$obsScores]

无需担心尺寸的差异。 R很乐意重用价值观。

第二种方法,你可以使用因子变量

df$factorScore <- factor(df$obsScores, levels=1:length(scores$z1), labels=scores$z1)

第一个更适合分析。