Может ли кто-нибудь сказать мне, почему R не использует весь data.frame для этого chisq.test?

Я не могу придумать решение проблемы, с которой я столкнулся, когда пытался создать свой собственный data.frame и провести на нем количественный анализ (например, chisq.test).

Фон выглядит следующим образом: я обобщил данные, которые я получил относительно двух больниц. Оба измеряли одну и ту же категориальную переменную n раз. В данном случае это то, как часто бактерии, связанные с оказанием медицинской помощи, обнаруживались в течение определенного периода наблюдения.

В таблице сводные данные выглядят следующим образом, где % означает процент от всех измерений, выполненных за период времени.

                                    n Hospital 1 (%)      n Hospital 2 (%)
Healthcare associated bacteria          829 (59.4)            578 (57.6)
Community associated bacteria           473 (33.9)            372 (37.1)
Contaminants                             94 (6.7)              53 (5.3)
Total                                  1396 (100.0)          1003 (100.0)

Теперь, глядя на проценты, становится очевидным, что пропорции очень похожи, и вы можете задаться вопросом, с какой стати я хочу статистически сравнивать две больницы. Но у меня есть другие данные, где пропорции другие, поэтому цели этого вопроса:

Как сравнить Больницу 1 с Больницей 2 в отношении измеряемых категорий.

Поскольку данные представлены в обобщенном виде и в формате массива, я решил сделать data.frame для каждой из отдельных переменных/категорий.

hosp1 <- rep(c("Yes", "No"), times=c(829,567))
hosp2 <- rep(c("Yes", "No"), times=c(578,425))
all <- cbind(hosp1, c(hosp2,rep(NA, length(hosp1)-length(hosp2))))
all <- data.frame(all)
names(all)[2]<-"hosp2"
summary(all)

Пока все хорошо, потому что резюме выглядит правильным, чтобы теперь можно было запустить chisq.test(). Но теперь все становится странно.

with(all, chisq.test(hosp1, hosp2, correct=F))

    Pearson's Chi-squared test

data:  hosp1 and hosp2
X-squared = 286.3087, df = 1, p-value < 2.2e-16

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

with(all, table(hosp1, hosp2))

       No Yes
  No  174   0
  Yes 251 578

Так что, конечно, если данные суммировать таким образом, будет статистически значимое открытие, потому что одна категория резюмируется как не имеющая измерений вообще. Почему это происходит и что я могу сделать, чтобы исправить это? Наконец, вместо того, чтобы создавать отдельные data.frame для каждой категории, существует ли очевидная функция для ее зацикливания? Я не могу придумать ни одного.

Спасибо за вашу помощь!

ОБНОВЛЕНО НА ОСНОВЕ ЗАПРОСА THELATEMAIL ДЛЯ RAW DATA.FRAME

dput(SO_Example_v1)
structure(list(Type = structure(c(3L, 1L, 2L), .Label = c("Community", 
"Contaminant", "Healthcare"), class = "factor"), hosp1_WoundAssocType = c(464L, 
285L, 24L), hosp1_BloodAssocType = c(73L, 40L, 26L), hosp1_UrineAssocType = c(75L, 
37L, 18L), hosp1_RespAssocType = c(137L, 77L, 2L), hosp1_CathAssocType = c(80L, 
34L, 24L), hosp2_WoundAssocType = c(171L, 115L, 17L), hosp2_BloodAssocType = c(127L, 
62L, 12L), hosp2_UrineAssocType = c(50L, 29L, 6L), hosp2_RespAssocType = c(135L, 
142L, 6L), hosp2_CathAssocType = c(95L, 24L, 12L)), .Names = c("Type", 
"hosp1_WoundAssocType", "hosp1_BloodAssocType", "hosp1_UrineAssocType", 
"hosp1_RespAssocType", "hosp1_CathAssocType", "hosp2_WoundAssocType", 
"hosp2_BloodAssocType", "hosp2_UrineAssocType", "hosp2_RespAssocType", 
"hosp2_CathAssocType"), class = "data.frame", row.names = c(NA, 
-3L))

Объяснение: Этот data.frame на самом деле более сложен, чем то, что кратко изложено в таблице выше, поскольку он также содержит информацию о том, где культивировались определенные типы бактерий (например, в ранах, посевах крови, катетерах и т. д.). Итак, таблица, которую я делаю, на самом деле выглядит следующим образом:

                                                 All locations
                                n Hospital 1 (%)      n Hospital 2 (%)  p-val
Healthcare associated bacteria     829 (59.4)            578 (57.6)     0.39
Community associated bacteria      473 (33.9)            372 (37.1)     ...
Contaminants                       94 (6.7)              53 (5.3)       ...
Total                              1396 (100.0)          1003 (100.0)   -

Где заголовок «Все местоположения» впоследствии будет заменен на рану, кровь, мочу, катетер и т. д.


person OFish    schedule 11.03.2015    source источник
comment
Потому что то, что вы тестируете, — это ответы переменной hosp1, сгруппированные по ответам переменной 2 hosp2 в соответствии с вашей последней таблицей. Это определенно будет значительно отличаться, как вы можете ясно видеть. chisq.test, с другой стороны, будет работать так, как вы ожидаете, если вы передадите ему матрицу 2x2, представляющую количество в каждой категории, например: chisq.test(cbind(c(829,567),c(578,425)),correct=FALSE) - p-value = 0,39, что более ожидаемо. В отличие от SPSS и т. д., R гораздо более удобен для работы со сводными данными, поскольку позволяет использовать таблицы, матрицы, списки и т. д. в качестве альтернативных методов ввода данных.   -  person thelatemail    schedule 11.03.2015
comment
ХА! Спасибо за быстрый ответ. На самом деле это действительно потрясающая деталь, которую я не знал о chisq.test()! Действительно очень красиво и удобно!!! Теперь, если у кого-то есть идея для отличной функции, которая избавит меня от необходимости делать это для каждой категории, это было бы здорово. Но, конечно, за позднее письмо проголосовали, так как это правильный ответ!!   -  person OFish    schedule 11.03.2015
comment
Если бы вы могли предоставить точную индикацию R (предпочтительно с использованием dput) ваших исходных «данных массива» для подсчета бактерий да / нет, то я уверен, что мудрые люди из SO могли бы найти способ упростить ваш анализ.   -  person thelatemail    schedule 11.03.2015
comment
Хе-хе, на самом деле это не так просто, потому что то, что я так аккуратно разместил здесь, на самом деле является сводкой еще более запутанных данных. Раньше я задавал вопросы, относящиеся к одному и тому же типу данных в целом (но с разными категориальными переменными) здесь, но я пришел к выводу, что ответ, который мне был предоставлен, на самом деле не правильно рассчитывал, хотя я могу ошибаться в этой оценке.   -  person OFish    schedule 11.03.2015
comment
@thelatemail, я обновил исходный вопрос, предоставив необработанные данные, используемые для этого примера. Извините за задержку.   -  person OFish    schedule 12.03.2015


Ответы (1)


Ответ на вопрос о том, как заставить p-значения работать, несколько прост. Вы можете получить два других p-значения, которые вы ищете, используя тот же синтаксис, что и @thelatemail, используемый следующим образом:

#community (p = 0.1049)
chisq.test(cbind(c(473,923),c(372,631)),correct=FALSE)

#contaminants (p = 0.1443)
chisq.test(cbind(c(94,1302),c(53,950)),correct=FALSE)

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

out <- cbind(rowSums(SO_Example_v1[,2:6]),rowSums(SO_Example_v1[,7:11]))
chisq.test(rbind(out[1,],colSums(out[2:3,])),correct=FALSE)
chisq.test(rbind(out[2,],colSums(out[c(1,3),])),correct=FALSE)
chisq.test(rbind(out[3,],colSums(out[1:2,])),correct=FALSE)

Конечно, на данный момент мы выходим за рамки SO, но, возможно, более уместный вопрос, учитывая характер данных, заключается в том, есть ли разница между больницами в целом, на которую вы можете ответить (с точки зрения частотности), используя критерий хи-квадрат, основанный на всех трех типах:

chisq.test(out,correct=FALSE)
person Sam Dickson    schedule 19.11.2015
comment
Спасибо, Сэм. Программный подход - очень хорошая мысль. И да, как вы предложили, общие различия были изначально проверены. Ваш вклад очень ценится! Здоровья, О. - person OFish; 20.11.2015