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