Форматирование результатов экзамена для выполнения t-теста в R
Обзор вопросов: у меня есть набор данных, содержащий результаты 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 ответа
Как насчет этого:
переписал свой цикл - не нужно много беспокоиться о NA
S, как вы относитесь к ним как 0
мы можем просто проверить результаты и после набора NA
s как 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" ...
Вы можете попробовать передать следующий аргумент в вызов t.test:
na.action = na.omit
Что-то вроде:
with(qDat, t.test(`1Pre`, `1Post`, na.action = na.omit))