R: проблема с вычислением средней точности с помощью функции strsplit - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь вычислить точность ответа участников (столбцы EQ_R и MEM_R) на основе правильного ответа (столбцы EQ_C и MEM_C).

dput(example) 
structure(list(TRIAL = c("1", "2", "3", "4", "5", "6", "7", "8", 
"9", "10", "11", "12", "13", "14", "15"), EQ_C = c("0101", "1010", 
"1010", "00111", "01011", "01101", "100011", "010101", "001101", 
"0110011", "1101001", "1100101", "11100001", "11001010", "11001010"
), EQ_R = c("0101", "0010", "1010", "00111", "01011", "01101", 
"10101", "11010", "001101", "0100011", "1101001", "0100101", 
"11110001", "11001010", "11001010"), MEM_C = c("ZLHK", "RZKX", 
"DGWL", "BCJSP", "WRKTJ", "CHBXS", "HNDCWX", "SWVNDT", "WLDGPB", 
"DSHRKBV", "HCXLZWB", "HDNBVZC", "BCRHKVDM", "RVTBWKFS", "NWHVZFLD"
), MEM_R = c("ZLHK", "RZKX", "DGWL", "BCJSP", "WRKLTJ", "CHBXS", 
"HNDCWX", "SWVDTN", "WLDGPB", "DSHRKBV", "HCXLZWB", "HDNBVZC", 
"BCRHKVDM", "RVTBWKFS", "NWHVZFLD"), EQ_SUM = c(NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), MEM_SUM = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names             
 = c(NA, 
15L), class = "data.frame")

Я добавил новый столбец для «суммы» / оценки точности, которые необходимо рассчитать для двоичных данных (EQ) и букв (MEM).

    OSPAN["EQ_SUM"] <- NA
    OSPAN["MEM_SUM"]<- NA

Затем я попытался вычислить точность с помощью strsplit, но я получаю уведомления об ошибках.

    mean(strsplit(OSPAN$MEM_C, "") == strsplit(OSPAN$MEM_R, ""))
    Error in strsplit(OSPAN$MEM_C, "") == strsplit(OSPAN$MEM_R, "") : comparison of these types is not implemented
    In addition:
    Warning messages:
    1: In strsplit(OSPAN$MEM_R, "") : input string 342 is invalid                             UTF-8
    2: In strsplit(OSPAN$MEM_R, "") : input string 580 is invalid UTF-8

Мой вопрос:

Как сопоставить / вычислить точность или соответствие между предиктором (C) и фактическими (R) значениями в столбцах суммы?

Например, в строке № 1 EQ_SUM будет равно 1 (или 100%), тогда как в # 2 это будет 0,75 или 75%, поскольку участник выбрал неправильный ответ (0 вместо 1). Таким образом, частичные кредитные оценки даны, и это не вопрос абсолютного соответствия / соответствия.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Я уверен, что есть наиболее эффективный способ, однако вы можете сравнить список за списком и добавить его в свой фрейм данных.

for (i in 1:nrow(OSPAN)){
  OSPAN$EQ_SUM[i] <- sum(strsplit(OSPAN$EQ_C, "", useBytes = TRUE)[[i]] == strsplit(OSPAN$EQ_R, "", useBytes = TRUE)[[i]])/length(strsplit(OSPAN$EQ_C, "")[[i]])
  OSPAN$MEM_SUM[i] <- sum(strsplit(OSPAN$MEM_C, "", useBytes = TRUE)[[i]] == strsplit(OSPAN$MEM_R, "", useBytes = TRUE)[[i]])/length(strsplit(OSPAN$MEM_C, "")[[i]])
}

С другой стороны, есть случаи различной длины, что нам с ними делать?

2 голосов
/ 21 мая 2019

Одной из возможностей может быть использование библиотеки RecordLinkage:

with(df, levenshteinSim(EQ_C, EQ_R))

 [1] 1.0000000 0.7500000 1.0000000 1.0000000 1.0000000 1.0000000 0.6666667 0.6666667
 [9] 1.0000000 0.8571429 1.0000000 0.8571429 0.8750000 1.0000000 1.0000000

Он вычисляет сходство между двумя строками, используя расстояние Левенштейна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...