【问题标题】:Rescore Items from Scoring Key从计分键重新计分项目
【发布时间】:2014-11-26 22:57:33
【问题描述】:

我有一组数据,其中向受访者提出了一系列问题,每个问题都有五个回答选项(例如,1:5)。给定这五个选项,我对每个问题都有一个评分键,其中一些答案值得满分(例如,2),其他答案是半分(1),而其他答案是零分(0)。因此,数据框是 n(人)x k(问题),评分键是 k(问题)x m(响应)矩阵。

我要做的是以编程方式创建重新评分项目的新数据集。普通数据集:

x <- sample(c(1:5), 50, replace = TRUE)
y <- sample(c(1:5), 50, replace = TRUE)
z <- sample(c(1:5), 50, replace = TRUE)
dat <- data.frame(cbind(x,y,z)) # 3 items, 50 observations (5 options per item)
head(dat)
  x y z
1 3 1 2
2 2 1 3
3 5 3 4
4 1 4 5
5 1 3 4
6 4 5 4

# Each option is scored 0, 1, or 2:
key <- matrix(sample(c(0,0,1,1,2), size = 15, replace = TRUE), ncol=5)
key
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    1    2
[2,]    2    1    1    1    2
[3,]    2    2    1    1    2

【问题讨论】:

  • 您为什么使用data.frame(cbind(.)) 而不仅仅是data.frame(.)。前者是不好的做法,尤其是在被绑定的向量是不同类型的情况下。
  • 好点! cbind() 在这里是不必要的。

标签: r plyr scoring


【解决方案1】:

对于后人,我正在与一位朋友讨论这个问题,他提出了另一种方法。这样做的好处是它仍然使用 mapvalues() 来进行重新评分,但不需要 for 循环,而是使用 sapply 中的“from”来进行索引。

library(plyr)
scored <- sapply(1:ncol(raw), function(x, dat, key){
  mapvalues(dat[,x], from = 1:ncol(key), to = key[x,])    
}, dat = dat, key = key)

【讨论】:

  • 技术上,sapply 是一个for 循环——只是稍微优化了 :-)
【解决方案2】:

其他一些选项,首先使用Map

data.frame(Map( function(x,y)  key[y,x], dat, seq_along(dat) ))

#  x y z
#1 0 2 2
#2 0 2 1
#3 2 1 1
#4 0 1 2
#5 0 1 1
#6 1 2 1

其次在key上使用矩阵索引:

newdat <- dat
newdat[] <- key[cbind( as.vector(col(dat)), unlist(dat) )]
newdat

#  x y z
#1 0 2 2
#2 0 2 1
#3 2 1 1
#4 0 1 2
#5 0 1 1
#6 1 2 1

如果您将key 指定为list,事情会更简单:

key <- list(x=c(0,0,0,1,2),y=c(2,1,1,1,2),z=c(2,2,1,1,2))
data.frame(Map("[",key,dat))

#  x y z
#1 0 2 2
#2 0 2 1
#3 2 1 1
#4 0 1 2
#5 0 1 1
#6 1 2 1

【讨论】:

  • 也许我漏掉了什么,但总的来说,得分键是如何确定的?
  • @RichardScriven - 没有明确指定。 key 的每一行是一个问题,每一列是响应 (1-5)。返回值为单元格的内容。
  • 是的,在这个例子中,我只是随机生成了密钥(问题中代码的第二部分)。实际上,关键将基于专家评分协议(> 50% 的专家同意一个选项得到 2 的值,5-49% 的专家同意得到 1 的值,而认可的选项少于 5%的时间获得值 0)。然后,这将通过 mirt 用于部分信用等级响应模型。
【解决方案3】:

我目前的工作方法是使用 1) mapvalues,它位于 package:plyr 中来完成繁重的工作:它需要一个数据向量来修改,以及两个附加参数“from”,这是原始数据(这里是 1:5)和“to”,或者我们想要将数据转换成什么;并且,2) 带有索引符号的for 循环,我们在其中循环遍历可用问题,使用当前循环值提取与每个问题相关的向量,并使用它从我们的评分键中选择正确的行。

library(plyr)
newdat <- matrix(data=NA, nrow=nrow(dat), ncol=ncol(dat))
for (i in 1:3) {
    newdat[,i] <- mapvalues(dat[,i], from = c(1,2,3,4,5), 
                            to = c(key[i,1], key[i,2], key[i,3], key[i,4], key[i,5]))
}
head(newdat)
     [,1] [,2] [,3]
[1,]    0    2    2
[2,]    0    2    1
[3,]    2    1    1
[4,]    0    1    2
[5,]    0    1    1
[6,]    1    2    1

我对这个解决方案非常满意,但如果有人有更好的方法,我很乐意看到他们!

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多