2015-03-11 11 views
5

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

+4

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

+0

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

+2

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

Odpowiedz

1

odpowiedź na pytanie o to, jak sprawić, aby wartości p zadziałały, jest dość proste.Można uzyskać inne dwie wartości p, że jesteś w poszukiwaniu stosując tę ​​samą składnię jak @thelatemail wykorzystane w następujący sposób:

#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) 

można uzyskać odpowiedzi na te pytania bardziej programowo następująco:

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) 

Oczywiście, w tym momencie wychodzimy poza zakres SO, ale być może bardziej istotne jest pytanie o charakter danych, jeśli istnieje ogólna różnica między szpitalami, na które można odpowiedzieć (z perspektywy test chi-kwadrat oparty na wszystkich trzech typach:

chisq.test(out,correct=FALSE) 
+0

Dzięki sam. Podejście programowe to bardzo dobra myśl. I tak, zgodnie z propozycją, ogólne różnice zostały wstępnie sprawdzone. Twój wkład jest bardzo doceniany! Pozdrawiam, O. – OFish

Powiązane problemy