I batteri raccolti sulle dita dopo più contatti di superficie: dati non normali, misure ripetute, partecipanti incrociati


9

Intro

Ho partecipanti che toccano ripetutamente superfici contaminate con E. coli in due condizioni ( A = indossando guanti, B = senza guanti). Voglio sapere se c'è una differenza tra la quantità di batteri sulla punta delle dita con e senza guanti, ma anche tra il numero di contatti. Entrambi i fattori sono all'interno del partecipante.

Metodo sperimentale:

I partecipanti (n = 35) toccano ogni quadrato una volta con lo stesso dito per un massimo di 8 contatti (vedi figura a). a) contatti delle dita con 8 superfici, b) CFU sulle dita dopo ogni contatto di superficie

Tampo quindi il dito del partecipante e misuro i batteri sulla punta del dito dopo ogni contatto. Quindi usano un nuovo dito per toccare un numero diverso di superfici e così via da 1 a 8 contatti (vedi figura b).

Ecco i dati reali : dati reali

I dati non sono normali, quindi vedi la distribuzione marginale dei batteri | NumeroContatti di seguito. x = batteri. Ogni aspetto è un numero diverso di contatti.

inserisci qui la descrizione dell'immagine

MODELLO

Provando da lme4 :: glmer in base ai suggerimenti di amoeba usando Gamma (link = "log") e polinomiale per NumberContacts:

cfug<-glmer(CFU ~ Gloves + poly(NumberContacts,2) + (-1+NumberContacts|Participant),
            data=(K,CFU<4E5),
           family=Gamma(link="log")
            )
plot(cfug)

NB. Gamma (link = "inverse") non funzionerà dicendo che il dimezzamento di PIRLS non è riuscito a ridurre la devianza.

risultati:

Adatto vs residui per cfug inserisci qui la descrizione dell'immagine

QQP (resid (cfug))

inserisci qui la descrizione dell'immagine

Domanda:

Il mio modello di glmer è correttamente definito per incorporare gli effetti casuali di ciascun partecipante e il fatto che tutti fanno entrambi l'esperimento A seguito dall'esperimento B ?

aggiunta:

L'autocorrelazione sembra esistere tra i partecipanti. Questo probabilmente perché non sono stati testati lo stesso giorno e la beuta di batteri cresce e diminuisce nel tempo. Importa?

acf (CFU, ritardo = 35) mostra una correlazione significativa tra un partecipante e il successivo.

inserisci qui la descrizione dell'immagine


1
È possibile utilizzare NumberContactscome fattore numerico e includere termini polinomiali quadratici / cubici. Oppure guarda i modelli misti additivi generalizzati.
amoeba,

1
@amoeba Grazie per il tuo aiuto. Tutti i partecipanti hanno fatto B (non amato) seguito da A (guantato). Pensi che ci siano altri problemi fondamentali con l'analisi? In tal caso, sono aperto a ulteriori risposte.
HCAI,

1
In tal caso, puoi includere l'effetto casuale del guanto. Inoltre, non capisco perché rimuovete l'intercettazione casuale e perché non includete l'intero polinomio di secondo grado nella parte casuale. E puoi avere un'interazione guanto * num. Quindi perché no CFU ~ Gloves * poly(NumberContacts,2) + (Gloves * poly(NumberContacts,2) | Participant)o qualcosa del genere.
ameba,

1
Oh, capisco l'intercettazione, ma allora dovresti sopprimere anche l'intercetta fissa. Inoltre, per zero contatti dovresti avere zero CFU, ma con log-link questo non ha senso. E non hai nessun punto CFU vicino a 1 contatto. Quindi non sopprimerei l'intercettazione. Non convergere non va bene, prova a rimuovere l'interazione dalla parte casuale: CFU ~ Gloves * poly(NumberContacts,2) + (Gloves + poly(NumberContacts,2) | Participant)o forse rimuovi i Guanti da lì CFU ~ Gloves * poly(NumberContacts,2) + (poly(NumberContacts,2) | Participant)...
amoeba

1
Penso che Gloves * poly(NumberContacts,2) + (poly(NumberContacts,2) | Participant)sia un modello abbastanza decente.
amoeba,

Risposte:


6

Alcuni grafici per esplorare i dati

Di seguito sono riportati otto, uno per ogni numero di contatti di superficie, trame xy che mostrano guanti anziché guanti.

Ogni individuo è tracciato con un punto. La media, la varianza e la covarianza sono indicate con un punto rosso e l'ellisse (distanza di Mahalanobis corrispondente al 97,5% della popolazione).

14

La piccola correlazione mostra che c'è effettivamente un effetto casuale da parte degli individui (se non ci fosse un effetto da parte della persona, allora non ci dovrebbe essere alcuna correlazione tra guanti accoppiati e guanti). Ma è solo un piccolo effetto e un individuo può avere diversi effetti casuali per "guanti" e "senza guanti" (ad es. Per tutti i diversi punti di contatto l'individuo può avere conteggi costantemente più alti / inferiori per "guanti" rispetto a "nessun guanti") .

trame xy di con e senza guanti

Sotto la trama sono trame separate per ciascuna delle 35 persone. L'idea di questa trama è vedere se il comportamento è omogeneo e anche vedere quale tipo di funzione sembra adatta.

Si noti che "senza guanti" è in rosso. Nella maggior parte dei casi la linea rossa è più alta, più batteri per i casi "senza guanti".

Credo che una trama lineare dovrebbe essere sufficiente per catturare le tendenze qui. Lo svantaggio del diagramma quadratico è che i coefficienti saranno più difficili da interpretare (non vedrai direttamente se la pendenza è positiva o negativa perché sia ​​il termine lineare che il termine quadratico influiscono su questo).

Ma soprattutto, vedi che le tendenze differiscono molto tra i diversi individui e quindi può essere utile aggiungere un effetto casuale non solo all'intercetta, ma anche alla pendenza dell'individuo.

trame per ogni individuo

Modello

Con il modello qui sotto

  • Ad ogni individuo verrà adattata la propria curva (effetti casuali per coefficienti lineari).
  • yN(log(μ),σ2)log(y)N(μ,σ2)
  • I pesi vengono applicati perché i dati sono eteroschedastici. La variazione è più stretta verso i numeri più alti. Ciò è probabilmente dovuto al fatto che il conteggio dei batteri ha un certo limite e la variazione è dovuta principalmente alla mancata trasmissione dalla superficie al dito (= correlata a conteggi inferiori). Vedi anche nei 35 grafici. Ci sono principalmente alcuni individui per i quali la variazione è molto più elevata delle altre. (vediamo anche code più grandi, sovraispersione, nei grafici qq)
  • Non viene utilizzato alcun termine di intercettazione e viene aggiunto un termine di "contrasto". Questo viene fatto per facilitare l'interpretazione dei coefficienti.

.

K    <- read.csv("~/Downloads/K.txt", sep="")
data <- K[K$Surface == 'P',]
Contactsnumber   <- data$NumberContacts
Contactscontrast <- data$NumberContacts * (1-2*(data$Gloves == 'U'))
data <- cbind(data, Contactsnumber, Contactscontrast)
m    <- lmer(log10CFU ~ 0 + Gloves + Contactsnumber + Contactscontrast + 
                        (0 + Gloves + Contactsnumber + Contactscontrast|Participant) ,
             data=data, weights = data$log10CFU)

Questo da

> summary(m)
Linear mixed model fit by REML ['lmerMod']
Formula: log10CFU ~ 0 + Gloves + Contactsnumber + Contactscontrast + (0 +  
    Gloves + Contactsnumber + Contactscontrast | Participant)
   Data: data
Weights: data$log10CFU

REML criterion at convergence: 180.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.0972 -0.5141  0.0500  0.5448  5.1193 

Random effects:
 Groups      Name             Variance  Std.Dev. Corr             
 Participant GlovesG          0.1242953 0.35256                   
             GlovesU          0.0542441 0.23290   0.03            
             Contactsnumber   0.0007191 0.02682  -0.60 -0.13      
             Contactscontrast 0.0009701 0.03115  -0.70  0.49  0.51
 Residual                     0.2496486 0.49965                   
Number of obs: 560, groups:  Participant, 35

Fixed effects:
                  Estimate Std. Error t value
GlovesG           4.203829   0.067646   62.14
GlovesU           4.363972   0.050226   86.89
Contactsnumber    0.043916   0.006308    6.96
Contactscontrast -0.007464   0.006854   -1.09

QQPlot

residui

codice per ottenere grafici

chemiometria :: funzione drawMahal

# editted from chemometrics::drawMahal
drawelipse <- function (x, center, covariance, quantile = c(0.975, 0.75, 0.5, 
                                              0.25), m = 1000, lwdcrit = 1, ...) 
{
  me <- center
  covm <- covariance
  cov.svd <- svd(covm, nv = 0)
  r <- cov.svd[["u"]] %*% diag(sqrt(cov.svd[["d"]]))
  alphamd <- sqrt(qchisq(quantile, 2))
  lalpha <- length(alphamd)
  for (j in 1:lalpha) {
    e1md <- cos(c(0:m)/m * 2 * pi) * alphamd[j]
    e2md <- sin(c(0:m)/m * 2 * pi) * alphamd[j]
    emd <- cbind(e1md, e2md)
    ttmd <- t(r %*% t(emd)) + rep(1, m + 1) %o% me
#    if (j == 1) {
#      xmax <- max(c(x[, 1], ttmd[, 1]))
#      xmin <- min(c(x[, 1], ttmd[, 1]))
#      ymax <- max(c(x[, 2], ttmd[, 2]))
#      ymin <- min(c(x[, 2], ttmd[, 2]))
#      plot(x, xlim = c(xmin, xmax), ylim = c(ymin, ymax), 
#           ...)
#    }
  }
  sdx <- sd(x[, 1])
  sdy <- sd(x[, 2])
  for (j in 2:lalpha) {
    e1md <- cos(c(0:m)/m * 2 * pi) * alphamd[j]
    e2md <- sin(c(0:m)/m * 2 * pi) * alphamd[j]
    emd <- cbind(e1md, e2md)
    ttmd <- t(r %*% t(emd)) + rep(1, m + 1) %o% me
#    lines(ttmd[, 1], ttmd[, 2], type = "l", col = 2)
    lines(ttmd[, 1], ttmd[, 2], type = "l", col = 1, lty=2)  #
  }
  j <- 1
  e1md <- cos(c(0:m)/m * 2 * pi) * alphamd[j]
  e2md <- sin(c(0:m)/m * 2 * pi) * alphamd[j]
  emd <- cbind(e1md, e2md)
  ttmd <- t(r %*% t(emd)) + rep(1, m + 1) %o% me
#  lines(ttmd[, 1], ttmd[, 2], type = "l", col = 1, lwd = lwdcrit)
  invisible()
}

Trama 5 x 7

#### getting data
K <- read.csv("~/Downloads/K.txt", sep="")

### plotting 35 individuals

par(mar=c(2.6,2.6,2.1,1.1))
layout(matrix(1:35,5))

for (i in 1:35) {
  # selecting data with gloves for i-th participant
  sel <- c(1:624)[(K$Participant==i) & (K$Surface == 'P') & (K$Gloves == 'G')]
      # plot data
  plot(K$NumberContacts[sel],log(K$CFU,10)[sel], col=1,
       xlab="",ylab="",ylim=c(3,6))
      # model and plot fit
  m <- lm(log(K$CFU[sel],10) ~ K$NumberContacts[sel])
  lines(K$NumberContacts[sel],predict(m), col=1)

  # selecting data without gloves for i-th participant 
  sel <- c(1:624)[(K$Participant==i) & (K$Surface == 'P') & (K$Gloves == 'U')]
     # plot data 
  points(K$NumberContacts[sel],log(K$CFU,10)[sel], col=2)
     # model and plot fit
  m <- lm(log(K$CFU[sel],10) ~ K$NumberContacts[sel])
  lines(K$NumberContacts[sel],predict(m), col=2)
  title(paste0("participant ",i))
}

Trama 2 x 4

#### plotting 8 treatments (number of contacts)

par(mar=c(5.1,4.1,4.1,2.1))
layout(matrix(1:8,2,byrow=1))

for (i in c(1:8)) {
  # plot canvas
  plot(c(3,6),c(3,6), xlim = c(3,6), ylim = c(3,6), type="l", lty=2, xlab='gloves', ylab='no gloves')

  # select points and plot
  sel1 <- c(1:624)[(K$NumberContacts==i) & (K$Surface == 'P') & (K$Gloves == 'G')]
  sel2 <- c(1:624)[(K$NumberContacts==i) & (K$Surface == 'P') & (K$Gloves == 'U')]
  points(K$log10CFU[sel1],K$log10CFU[sel2])

  title(paste0("contact ",i))

  # plot mean
  points(mean(K$log10CFU[sel1]),mean(K$log10CFU[sel2]),pch=21,col=1,bg=2)

  # plot elipse for mahalanobis distance
  dd <- cbind(K$log10CFU[sel1],K$log10CFU[sel2])
  drawelipse(dd,center=apply(dd,2,mean),
            covariance=cov(dd),
            quantile=0.975,col="blue",
            xlim = c(3,6), ylim = c(3,6), type="l", lty=2, xlab='gloves', ylab='no gloves')
}

Grazie mille Martijn, hai spiegato le cose in modo così chiaro. Sorprendente! Dato che la taglia è finita prima che potessi assegnarla, vorrei davvero offrirti un importo separato (vedrò come farlo ora). Tuttavia, ho alcune domande: in primo luogo, la trasformazione dei dati sembra avere scuole di pensiero: alcuni sono d'accordo e altri sono in disaccordo con veemenza. Perché va bene qui? In secondo luogo, perché la rimozione dell'intercettazione casuale rende i coefficienti più facili da interpretare?
HCAI,

(2) Immagino che la trasformazione sia corretta quando si potrebbe sostenere che esiste un processo che rende logica la trasformazione (anzi trasformandola con riluttanza perché rende piacevoli i risultati può essere visto come manipolazione dei dati e travisamento dei risultati, oltre a non ottenere il sottostante modello)
Sisto Empirico

Vedo @Martijn, almeno in biologia la trasformazione da log10 è comune per i batteri. Sono felice di dare la grazia, te lo meriti. Ti dispiacerebbe approfondire un po 'il motivo per cui usi questo "termine di contrasto" per favore?
HCAI,

1
Per quanto riguarda il contrasto Vedi qui stats.stackexchange.com/a/308644/164061 Hai la libertà di spostare il termine di intercettazione. Un modo forse utile è impostare l'intercettazione tra le due categorie e lasciare che l'effetto sia la differenza tra i due effetti (uno sarà negativo l'altro positivo) rispetto a quel termine medio di intercettazione. (non che ho dovuto aggiungere una variabile per questo)
Sisto Empirico

1
Idealmente, i trattamenti dovrebbero essere distribuiti casualmente nel tempo in modo tale che ogni possibile effetto dovuto alle variazioni del tempo si stabilizzi. Ma in realtà non vedo così tanta autocorrelazione. Intendi salti come nel partecipante 5 tra 5 e 6 numero di contatti dopo i quali la linea è di nuovo stabile? Penso che questi non siano così male e al massimo aggiungano rumore ma non interferiscano con il tuo metodo (tranne per rendere il segnale / rumore basso). Puoi essere più sicuro quando non vedi un cambiamento sistematico nel tempo. Se hai elaborato i partecipanti in ordine, puoi tracciare il loro CFU medio nel tempo.
Sesto Empirico

2

Per quanto riguarda se usare MASS:glmmPQLo lme4:glmerper il tuo modello, la mia comprensione è che entrambe queste funzioni si adatteranno allo stesso modello (purché tu imposti l'equazione del modello, la distribuzione e la funzione di collegamento allo stesso modo) ma usano metodi di stima diversi per trovare l'adattamento. Potrei sbagliarmi, ma la mia comprensione dalla documentazione è che glmmPQLusa la quasi verosimiglianza penalizzata come descritto in Wolfinger e O'Connell (1993) , mentre glmerusa la quadratura di Gauss-Hermite. Se sei preoccupato per questo, puoi adattare il tuo modello con entrambi i metodi e verificare che forniscano le stesse stime dei coefficienti e in questo modo avrai maggiore sicurezza che l'algoritmo di adattamento si sia convertito ai veri MLE dei coefficienti.


Dovrebbe NumberContactsessere un fattore categorico?

Questa variabile ha un ordinamento naturale che appare dai tuoi grafici per avere una relazione regolare con la variabile di risposta, quindi potresti ragionevolmente trattarla come una variabile numerica. Se dovessi includere factor(NumberContacts), non vincolerai la sua forma e non perderai molti gradi di libertà. Potresti persino usare l'interazione Gloves*factor(NumberContacts)senza perdere troppi gradi di libertà. Tuttavia, vale la pena considerare se l'utilizzo di una variabile fattore comporterebbe un adattamento eccessivo dei dati. Dato che esiste una relazione abbastanza regolare nella trama, una semplice funzione lineare o quadratica otterrebbe buoni risultati senza adattamento eccessivo.


Come si fa Participantuna pendenza casuale ma non si intercetta la variabile?

Hai già messo la tua variabile di risposta su una scala logaritmica usando una funzione di collegamento logaritmico, quindi un effetto di intercettazione Participantsta dando un effetto moltiplicativo sulla risposta. Se dovessi dare una pendenza casuale all'interazione con NumberContactsquesto, ciò avrebbe un effetto basato sulla potenza sulla risposta. Se lo desideri, puoi ottenerlo con il (~ -1 + NumberContacts|Participant)quale rimuoverà l'intercettazione ma aggiungerai una pendenza in base al numero di contatti.


Dovrei usare Box-Cox per trasformare i miei dati? (ad esempio lambda = 0,779)

λ


Dovrei includere i pesi per la varianza?

Inizia guardando la trama residua per vedere se ci sono prove di eteroscedasticità. Sulla base delle trame che hai già incluso, mi sembra che questo non sia un problema, quindi non è necessario aggiungere pesi per la varianza. In caso di dubbio, è possibile aggiungere pesi utilizzando una semplice funzione lineare e quindi eseguire un test statistico per verificare se la pendenza della ponderazione è piatta. Ciò equivarrebbe a un test formale di eteroscedasticità, che ti darebbe un po 'di backup per la tua scelta.


Dovrei includere l'autocorrelazione in NumberContacts?

Se hai già incluso un termine effetto casuale per il partecipante, probabilmente sarebbe una cattiva idea aggiungere un termine di auto-correlazione sul numero di contatti. L'esperimento utilizza un dito diverso per diversi numeri di contatti, quindi non ti aspetteresti l'autocorrelazione per il caso in cui hai già rappresentato il partecipante. L'aggiunta di un termine di autocorrelazione oltre all'effetto partecipante significherebbe che si ritiene che esista una dipendenza condizionale tra il risultato di dita diverse, in base al numero di contatti, anche per un determinato partecipante.



Grazie, questa è una risposta incredibile! Alla fine ho provato Gamma (link = "log") e il barlume converge senza lamentele, evviva! glmer (CFU ~ Gloves + poly (NumberContacts, 2) + (-1 + NumberContacts | Participant), data = na.omit (sottoinsieme (K, CFU <4.5e5 & Surface == "P")), famiglia = Gamma ( link = "log")). QQplot penso che sia OK (niente al di fuori degli EC) ma le canalizzazioni adattate vs rididuali sono in canalizzazione (vedi la foto aggiunta aggiunta dopo che questo commento è stato pubblicato nel caso in cui non corrispondesse). Dovrei preoccuparmi troppo di quello?
HCAI,

1
La trama QQ mi sta bene. Inoltre, ricorda che in un GLM i residui di Pearson non seguono necessariamente una distribuzione normale. Sembra che tu abbia una buona analisi.
Ben - Ripristina Monica il

1

In effetti, è ragionevole sostenere che le misurazioni prese da un partecipante non sono indipendenti da quelle prese da un altro partecipante. Ad esempio, alcune persone potrebbero tendere a premere il dito con più (o meno) forza, il che influenzerebbe tutte le loro misurazioni attraverso ogni numero di contatti.

Quindi l'ANOVA a 2 vie a misure ripetute sarebbe un modello accettabile da applicare in questo caso.

In alternativa, si potrebbe anche applicare un modello a effetti misti con participantun fattore casuale. Questa è una soluzione più avanzata e più sofisticata.


Grazie Mihael, hai assolutamente ragione sulla pressione. Hmm, stavo leggendo il modello di effetti misti qui rcompanion.org/handbook/I_09.html ma non sono sicuro delle interazioni e dei fattori nidificati. I miei fattori sono nidificati?
HCAI

Vorrei anche sottolineare che i dati non sono normalmente distribuiti per ciascun contatto, quindi ho esaminato la modellizzazione di quasi-probabilità (PQL) penalizzata : ase.tufts.edu/gsc/gradresources/guidetomixedmodelsinr/… . Pensi che sia una buona scelta?
HCAI
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.