Форматирование результатов экзамена для выполнения t-теста в R - PullRequest
0 голосов
/ 21 января 2019

Обзор вопросов: У меня есть набор данных, содержащий результаты 15-ти вопросного экзамена до и после обучения. Я рассчитываю провести t-тест по результатам, чтобы сравнить общее значение, но у меня возникают трудности с форматированием набора данных должным образом. Пример части набора данных приведен ниже:

             1Pre  1Post   2Pre  2Post    3Pre  3Post    4Pre  4Post
Correct          B    B        A    A         B    B         C    C
1                B    B        C    D         C    B         C    C
2                C    B        B    D         C    B         C    A
3             <NA> <NA>     <NA> <NA>        <NA> <NA>       <NA> <NA>
4                B    B        B    A         B    B         C    C
5                B    B        B    A         B    B         C    C
6                C    B        D    A         A    D         C    B
7                C    C        D    D         E    E         C    C
8                C    A        B    B         A    A         <NA> <NA>

Цель: Я бы хотел сопоставить значение «Correct» со значениями в строках ниже для тестируемых, чтобы значение 1 было правильным, а значение 0 - неправильным. Я сделал это, используя следующий код:

for(j in 1:ncol(qDat)){
  for(i in 1:nrow(qDat)){
    if(qDat[i,j] == correctAns[1]){
      qDat[i,j]=1
    }else{
      qDat[i,j]=0
    }
  }
}

Затем я хотел бы провести t-тест, сравнивающий средние и последующие значения, а также сравнивать разницу между оценками до и после каждого вопроса, однако мне нужно пропустить любые точки данных с NA. В настоящее время мой метод не работает с любыми значениями NA и поэтому заменяет их на ноль. Есть ли способ запустить эти тесты и просто пропустить значения NA? Спасибо!

Желаемый выход:

             1Pre  1Post   2Pre  2Post    3Pre  3Post    
Correct          B    B        A    A         B    B         
1                1    1        0    0         0    1        
2                0    1        0    0         0    1        
3             <NA> <NA>     <NA> <NA>        <NA> <NA>       
4                1    1        0    0         1    1        
5                1    1        0    0         1    1        
6                0    1        0    1         0    0        
7                0    0        0    0         0    0         
8                0    0        0    0         0    0        

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Как насчет этого:

переписал ваш цикл - не нужно сильно беспокоиться о NA с, поскольку вы рассматриваете их как 0, мы можем просто проверить результаты и после установки NA скак FALSE:

test <- qDat == correctAns # or correctAns[1] depending on your needs
test[is.na(test)] <- FALSE
storage.mode(test) <- "integer"
test
#      X1 X2 X3 X4 X5 X6 X7 X8
# [1,]  0  1  0  0  1  0  1  0
# [2,]  0  0  1  0  0  0  0  0
# [3,]  0  1  0  0  1  0  0  0
# [4,]  0  0  1  0  0  0  0  0
# [5,]  1  0  0  0  0  0  1  0
# [6,]  0  0  1  1  1  1  1  0
# [7,]  0  0  0  1  0  0  1  0
# [8,]  0  0  0  0  0  0  0  1

с данными

set.seed(123)
correctAns <- sample(LETTERS[1:3], 8, replace = TRUE) 
correctAns
# [1] "A" "C" "B" "C" "C" "A" "B" "C"
qDat <- sample(c(LETTERS[1:3], NA_character_), 8*2*4, replace = TRUE)
qDat <- data.frame(matrix(qDat, 8, 4*2), stringsAsFactors = FALSE)
qDat
  #     X1   X2   X3   X4 X5   X6   X7   X8
  # 1    C    A    C    C  A    B    A <NA>
  # 2    B    A    C <NA>  B <NA> <NA>    B
  # 3 <NA>    B    C    A  B    A <NA> <NA>
  # 4    B <NA>    C    B  B    B    B <NA>
  # 5    C <NA>    B <NA>  A <NA>    C <NA>
  # 6    C    C    A    A  A    A    A    B
  # 7    A    C <NA>    B  A    C    B <NA>
  # 8 <NA> <NA> <NA>    A  B    A    B    C

Редактировать

set.seed(123)
#  correctAns is a vector of length 30
correctAns <- sample(LETTERS[1:3], 30, replace = TRUE) 
length(correctAns)
# [1] 30
# qDat is a dataframe of dimensions 106x30 
qDat <- sample(c(LETTERS[1:3], NA_character_), 106*30, replace = TRUE)
qDat <- data.frame(matrix(qDat, 106, 30), stringsAsFactors = FALSE)
dim(qDat)
# [1] 106  30

# still works
test <- qDat == correctAns
test[is.na(test)] <- FALSE
storage.mode(test) <- "integer"
str(test)
# int [1:106, 1:30] 0 0 0 0 0 0 0 0 1 0 ...
# - attr(*, "dimnames")=List of 2
# ..$ : NULL
# ..$ : chr [1:30] "X1" "X2" "X3" "X4" ...
0 голосов
/ 21 января 2019

Вы можете попробовать передать следующий аргумент в вызов t.test:

na.action = na.omit

Что-то вроде:

with(qDat, t.test(`1Pre`, `1Post`, na.action = na.omit))
...