Я не могу придумать решение проблемы, с которой я столкнулся, когда пытался создать свой собственный 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) -
Где заголовок «Все местоположения» впоследствии будет заменен на рану, кровь, мочу, катетер и т. д.
hosp1
, сгруппированные по ответам переменной 2hosp2
в соответствии с вашей последней таблицей. Это определенно будет значительно отличаться, как вы можете ясно видеть.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.2015chisq.test()
! Действительно очень красиво и удобно!!! Теперь, если у кого-то есть идея для отличной функции, которая избавит меня от необходимости делать это для каждой категории, это было бы здорово. Но, конечно, за позднее письмо проголосовали, так как это правильный ответ!! - person OFish   schedule 11.03.2015dput
) ваших исходных «данных массива» для подсчета бактерий да / нет, то я уверен, что мудрые люди из SO могли бы найти способ упростить ваш анализ. - person thelatemail   schedule 11.03.2015