2015-03-11 7 views
5

Non riesco a trovare una soluzione a un problema che ho riscontrato durante il tentativo di creare il mio data.frame ed eseguire un'analisi quantitativa (ad esempio chisq.test).Qualcuno può dirmi perché R non sta utilizzando l'intero data.frame per questo chisq.test?

Lo sfondo è il seguente: ho riassunto i dati che ho ricevuto relativi a due ospedali. Entrambi hanno misurato la stessa variabile categoriale n numero di volte. In questo caso è la frequenza con cui sono stati rilevati i batteri associati all'assistenza sanitaria durante uno specifico periodo di osservazione.

In una tabella, i dati riepilogati si presentano come segue, dove% indica la percentuale di tutte le misurazioni effettuate durante il periodo di tempo.

        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) 

Ora guardando le percentuali, è evidente che le proporzioni sono molto simili e ci si potrebbe chiedere perché mai voglio mettere a confronto statisticamente i due ospedali. Ma ho altri dati, dove le proporzioni sono diverse e quindi gli obiettivi di questa domanda sono:

Come confrontare Ospedale 1 con Ospedale 2 per quanto riguarda le categorie misurate.

Poiché i dati sono forniti in modo riassuntivo e in un formato array, ho deciso di creare un data.frame per ciascuna delle singole variabili/categorie.

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) 

Fin qui tutto bene, perché la sintesi sembra guardare a destra per essere in grado di eseguire ora un chisq.test(). Ma ora, le cose diventano strane.

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 

I risultati, sembrano indicare che c'è una differenza significativa. Se si incrociare i dati, si vede che R è riassumendo in un modo molto strano:

with(all, table(hosp1, hosp2)) 

     No Yes 
    No 174 0 
    Yes 251 578 

Così, naturalmente, se i dati sono riassunti in questo modo, ci sarà un risultato statisticamente significativo - perché una categoria è riassunto come privo di misurazioni. Perché diamine sta succedendo e cosa posso fare per correggerlo? Infine, invece di dover creare un distinto data.frame per ciascuna categoria, esiste comunque una funzione evidente per eseguirne il ciclo? Non riesco a inventarne uno.

Grazie per il vostro aiuto!

aggiornato in base alla richiesta THELATEMAIL PER PRIME 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)) 

Spiegazione: Questo data.frame è in realtà più complicato di quello che viene riassunto nella tabella di cui sopra, in quanto contiene anche il luogo dove i tipi specifici di batteri dove colto (cioè in ferite, emocolture, cateteri, ecc.). Quindi la tabella che sto facendo oggi si presenta come segue:

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

Se la voce "Tutte le posizioni", sarà successivamente sostituita dalla ferita, sangue, urine, ecc catetere

+4

Perché ciò che si sta testando è la risposta variabile 'hosp1', raggruppata dalle variabili 2 risposte' hosp2', come da ultima tabella. Questo sarà sicuramente molto diverso, come puoi vedere chiaramente. 'chisq.test' d'altra parte funzionerà come ci si aspetta se si passa una matrice 2x2 ad essa rappresentando i conteggi in ciascuna categoria, ad esempio:' chisq.test (cbind (c (829,567), c (578,425)), corretto = FALSE) '- valore-p = 0,39, che è più previsto. A differenza di SPSS ecc., R è molto più favorevole a lavorare con i dati di riepilogo perché consente tabelle, matrici, elenchi ecc. Come metodi alternativi per inserire dati. – thelatemail

+0

HA! Grazie per la tua risposta veloce. Questo è davvero un dettaglio davvero eccezionale che non conoscevo sul 'chisq.test()'! Molto bello e maneggevole davvero !!! Ora se qualcuno ha un'idea per una funzione elegante che mi eviterebbe di doverlo fare per ogni categoria, sarebbe fantastico. Ma ovviamente la posta vocale è upvoted, poiché è la risposta giusta !! – OFish

+2

Se è possibile fornire un'indicazione R esatta (utilizzando 'dput' preferibilmente) dei propri 'dati dell'array' originali per il numero di si/no di batteri, allora sono sicuro che la saggia gente di SO potrebbe trovare un modo per semplificare l'analisi . – thelatemail

risposta

1

La risposta a la domanda su come far funzionare i p-values ​​è piuttosto semplice.È possibile ottenere gli altri due valori di p che stai cercando di utilizzare la stessa sintassi @thelatemail utilizzato come segue:

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

È possibile ottenere queste risposte più a livello di codice come segue:

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) 

Naturalmente, a questo punto stiamo superando lo scopo di SO, ma forse una domanda più pertinente data la natura dei dati è se c'è una differenza tra gli ospedali in generale, a cui puoi rispondere (da una prospettiva frequentista) usando un test del chi quadrato basato su tutti e tre i tipi:

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

Grazie sam. L'approccio programmatico è un ottimo pensiero. E sì, come hai proposto le differenze complessive sono state ispezionate inizialmente. Il tuo contributo è molto apprezzato! Saluti, O. – OFish

Problemi correlati