Сообщение об ошибке chisq.test - PullRequest
1 голос
/ 19 января 2011

Вот проблема, с которой я сталкиваюсь:

Пример данных

df <- data.frame(1,2,3,4,5,6,7,8)
df <- rbind(df,df,df,df)

Что я хотел бы сделать, так это найти значение p.value для chisq.test, равное 1,2,3 против 4,5,6, в data.frame, определенном выше, в первой строке.

Давайте попробуем это изо всех сил:

chisq.test(c(1,2,3),c(4,5,6))$p.value ## this works.

Но когда я пытаюсь сделать это, вызывая столбцы / строки ...

chisq.test(df[1,1:3],df[1,4:6])$p.value

Дает: ошибка в complete.cases (x, y): не все аргументы имеют одинаковую длину

Интересно, потому что это не похоже на правду:

length(df[1,1:3])
length(df[1,4:6])

Есть мысли о том, как изменить обозначения, чтобы получить желаемый результат?

Ответы [ 2 ]

5 голосов
/ 20 января 2011

?chisq.test говорит нам:

Arguments:

       x: a numeric vector or matrix. ‘x’ and ‘y’ can also both be
          factors.

       y: a numeric vector; ignored if ‘x’ is a matrix.  If ‘x’ is a
          factor, ‘y’ should be a factor of the same length.

Если мы посмотрим на df согласно вашему Q, вы определите подмножества:

> is.numeric(df[1,1:3])
[1] FALSE
> is.vector(df[1,1:3])
[1] FALSE
> is.matrix(df[1,1:3])
[1] FALSE

и то же самое для вашегодругое подмножество.То, что происходит тогда, находится на коленях Бога.Внутри происходит то, что, поскольку df[1,1:3] является фреймом данных, он сначала преобразуется в матрицу из одного столбца, а затем в вектор:

Browse[2]> x ## here x is df[1,1:3]
[1] 1 2 3

, а df[1,4:6] (y в *Функция 1015 *) остается нетронутой:

Browse[2]> y
  X4 X5 X6
1  4  5  6

, и когда код вызывает complete.cases(x,y), мы получаем сообщение об ошибке:

Browse[2]> complete.cases(x, y)
Error in complete.cases(x, y) : not all arguments have the same length

complete.cases вызывает внутренний код, поэтому мыне может видеть, что происходит, но по существу R думает, что x и y не имеют одинаковую длину, и это потому, что они разных типов.

@ Prasad предоставляет обходной путь, а именноперечисление двух фреймов данных, которые вы предоставляете для chisq.test, в векторы.

Однако то, как вы используете функцию, не имеет особого смысла, по крайней мере для меня.Обычно можно хранить данные в столбцах, а не в строках фрейма данных.Может показаться, что разница не существует, но столбцы фрейма данных являются его компонентами, например компонентами списка.Каждый отдельный компонент (столбец) представляет собой отдельный объект, вектор данных о / n / наблюдениях в кадре данных.Если мы транспонируем ваш df (и приводим обратно к фрейму данных), чтобы отразить более естественную настройку данных:

> df2 <- data.frame(t(df))

, тогда мы можем использовать подход, который вы использовали, но индексировать отдельные строкипервый столбец df2 (а не отдельные столбцы первой строки df) в вызове chisq.test:

> chisq.test(df2[1:3,1], df2[4:6,1])

    Pearson's Chi-squared test

data:  df2[1:3, 1] and df2[4:6, 1] 
X-squared = 6, df = 4, p-value = 0.1991

Warning message:
In chisq.test(df2[1:3, 1], df2[4:6, 1]) :
  Chi-squared approximation may be incorrect

Это работает, потому что R может отбрасывать пустое измерениев обоих подмножествах, поэтому оба входа являются векторами соответствующей длины:

> df2[1:3,1] ## drops the empty dimension!
[1] 1 2 3
> is.vector(df2[1:3,1])
[1] TRUE
2 голосов
/ 19 января 2011

Используйте unlist при извлечении строк из фрейма данных:

> chisq.test(unlist(df[1,1:3]),unlist(df[1,4:6]))$p.value
[1] 0.1991483
Warning message:
In chisq.test(unlist(df[1, 1:3]), unlist(df[1, 4:6])) :
  Chi-squared approximation may be incorrect
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...