ошибка t.test в R

У меня есть фрейм данных с 6 столбцами. Я устал выполнять t.test для каждой строки, сравнивая столбцы 1–3 со столбцами 4–6, используя следующую команду:

new.CL.10.ttest <- apply(new.CL, MARGIN = 1, function(m){
  t.test(x = m[1:3], y = m[4:6], alternative = 'two.sided')$p.value
})

Я получил следующую ошибку:

Error in if (stderr < 10 * .Machine$double.eps * max(abs(mx), abs(my))) stop("data are essentially constant") : 
  missing value where TRUE/FALSE needed In addition: Warning messages:
1: In mean.default(x) : argument is not numeric or logical: returning NA
2: In mean.default(y) : argument is not numeric or logical: returning NA

Подскажите, пожалуйста, как мне решить эту проблему?

Вот пример набора данных (первые 3 строки очень длинного списка). Числа на самом деле являются числами с плавающей запятой, но я округлил их для простоты:

col1    col2    col3   col4     col5    col6
80      100     96     96       93      97
50      45      47     45       54      39
53      44      52     45       68      47

Спасибо


person user3302763    schedule 12.12.2014    source источник
comment
Да, это работает, но где-то в моем длинном списке какая-то точка данных вызывает проблему. Есть ли способ найти точки данных, вызывающие проблему?   -  person user3302763    schedule 12.12.2014
comment
Почему сравнение 3 чисел с другими тремя числами с использованием t.test дает какую-либо полезную информацию?   -  person IRTFM    schedule 12.12.2014
comment
Это то, над чем я работаю. Фон здесь не важен. Мне просто нужно получить значения p для моего набора данных с помощью t.test. Я откорректирую множественную коррекцию позже.   -  person user3302763    schedule 12.12.2014
comment
@user3302763 user3302763 Я опубликовал решение. Не могли бы вы попробовать это на исходном наборе данных?   -  person akrun    schedule 12.12.2014


Ответы (1)


Предположим, что нет никаких изменений в наборе данных для конкретной строки

new.CL[2,] <- 45

Использование вашего кода дает

#Error in t.test.default(x = m[1:3], y = m[4:6], alternative = "two.sided") : 
# data are essentially constant

Я предполагаю, что сообщение об ошибке отличается, потому что ваши исходные строки данных floating numbers. Используя набор данных rounded, можно создать индекс logical для удаления строк в исходном/неокругленном наборе данных. Один из способов создать индекс — проверить, равен ли первый столбец всем столбцам в наборе данных (new.CL[,1]==new.CL). Из-за recycling он проверяет elementwise каждый столбец с первым столбцом. Получаем логическую матрицу TRUE/FALSE. В этой матрице некоторые строки имеют все TRUE, т. е. data здесь практически постоянно. Чтобы удалить эти строки, выполните rowSums и проверьте, равно ли оно ncol(new.CL).

indx <- !rowSums(new.CL[,1]==new.CL)==ncol(new.CL)

Or

 indx <- !!rowSums(new.CL[,1]!=new.CL)

new.Cl1 <- Orig.CL[indx,]

данные

new.CL <- structure(list(col1 = c(80L, 50L, 53L), col2 = c(100L, 45L, 44L
), col3 = c(96L, 47L, 52L), col4 = c(96L, 45L, 45L), col5 = c(93L, 
54L, 68L), col6 = c(97L, 39L, 47L)), .Names = c("col1", "col2", 
"col3", "col4", "col5", "col6"), class = "data.frame", row.names = c(NA, 
-3L))
person akrun    schedule 12.12.2014
comment
Это помогло. Спасибо большое. Не могли бы вы объяснить команду: indx ‹- !rowSums(new.CL[,1]==new.CL)==ncol(new.CL). Я не совсем понимаю это. Я использовал dim() для new.Cl1 и моего исходного списка, но не заметил никаких изменений в количестве строк. - person user3302763; 12.12.2014
comment
Спасибо за объяснение. Очень признателен - person user3302763; 12.12.2014