Nie mogę znaleźć rozwiązania problemu, który wystąpił podczas próby utworzenia własnego data.frame
i uruchomić analizę ilościową (taką jak chisq.test
).Czy ktoś może mi powiedzieć, dlaczego R nie używa całego pliku data.frame dla tego pliku chisq.test?
Zdjęcie przedstawia się następująco: Podsumowałem otrzymane dane dotyczące dwóch szpitali. Obie mierzyły tę samą kategoryczną zmienną n razy. W tym przypadku tak często wykryto bakterie związane z opieką zdrowotną podczas określonego okresu obserwacji.
W tabeli podsumowane dane wyglądają następująco, gdzie% wskazuje procent wszystkich pomiarów dokonanych w danym przedziale czasowym.
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)
Teraz patrząc na procenty, to jest oczywiste, że proporcje są bardzo podobne i można się zastanawiać, dlaczego na ziemi Chcę statystycznie porównać dwa szpitale. Ale mam inne dane, w których proporcje są różne, a więc cele tego pytania są następujące:
Jak porównać szpital 1 do szpitala 2 w odniesieniu do kategorii mierzonych.
Ponieważ dane są dostarczane w sposób sumaryczny i w postaci macierzy, postanowiłem utworzyć data.frame
dla każdej z pojedynczych zmiennych/kategorii.
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)
tej pory tak dobrze, ponieważ zestawienie wydaje się wyglądać dobrze, aby móc teraz uruchomić chisq.test()
. Ale teraz sprawy stają się dziwne.
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
Wyniki wydają się wskazywać na znaczącą różnicę. Jeśli crosstabulate dane, widać, że R jest podsumowując ją w bardzo dziwny sposób:
with(all, table(hosp1, hosp2))
No Yes
No 174 0
Yes 251 578
Więc oczywiście, jeśli dane są zestawione w taki sposób, że nie będzie statystycznie istotne stwierdzenie - ponieważ jednej kategorii jest podsumowany jako bez żadnych pomiarów. Dlaczego tak się dzieje i co mogę zrobić, żeby to poprawić? Na koniec, zamiast konieczności tworzenia oddzielnego data.frame
dla każdej kategorii, czy istnieje jakaś jawna funkcja do zapętlenia go? Nie mogę wymyślić jednego.
Dzięki za pomoc!
aktualizowany w oparciu o zapytanie THELATEMAIL dla 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))
Objaśnienie: data.frame
jest rzeczywiście bardziej skomplikowany niż to, co jest przedstawione w powyższej tabeli, gdyż zawiera również wtedy, gdy określone typy bakterii gdzie są hodowane (tj. w ranach, hodowlach krwi, cewnikach itp.). Więc tabela że robię faktycznie wygląda następująco:
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) -
Jeżeli nagłówek „Wszystkie lokalizacje”, będzie być następnie zastąpiony przez rany, krew, mocz, cewnik itp
Ponieważ testowane są zmienne odpowiedzi "hosp1", pogrupowane według zmiennej 2 odpowiedzi "hosp2", zgodnie z ostatnią tabelą. To z pewnością znacznie różni się, jak widać wyraźnie. 'chisq.test' będzie działać tak, jak się spodziewasz, jeśli przekażesz do niego matrycę 2x2 reprezentującą liczby w każdej kategorii - np .:' chisq.test (cind (c (829,567), c (578,425)), poprawny = FALSE) '- p-value = 0.39, co jest bardziej oczekiwane. W przeciwieństwie do SPSS itp., R jest znacznie bardziej sprzyjający pracy z danymi zbiorczymi, ponieważ umożliwia stosowanie tabel, macierzy, list itp. Jako alternatywnych metod wprowadzania danych. – thelatemail
HA! Dziękuję za szybką odpowiedź. To jest naprawdę niesamowity szczegół, którego nie znałem na temat 'chisq.test()'! Bardzo ładne i poręczne! Teraz, jeśli ktoś ma pomysł na fajną funkcję, która zaoszczędziłaby mi tego w przypadku każdej kategorii, byłoby to niesamowite. Ale oczywiście przegłosowano, ponieważ jest to właściwa odpowiedź! – OFish
Jeśli mógłbyś podać dokładny wskaźnik R (używając 'dput' korzystnie) swoich oryginalnych 'danych tablicowych' dla liczenia bakterii tak/nie, to jestem pewien, że mądrzy ludzie z SO mogli znaleźć sposób na uproszczenie twojej analizy . – thelatemail