Бактерії, зібрані на пальцях після декількох поверхневих контактів: ненормальні дані, повторні заходи, схрещені учасники


9

Вступ

У мене є учасники, які неодноразово торкаються забруднених поверхонь кишковою паличкою за двох умов ( А = носіння рукавичок, В = рукавички відсутні). Хочу знати, чи є різниця між кількістю бактерій на кінчиках пальців із рукавичками та без них, а також між кількістю контактів. Обидва фактори є всередині учасника.

Експериментальний метод:

Учасники (n = 35) торкаються одного квадрата одним і тим же пальцем не більше 8 контактів (див. Рисунок а). а) пальцеві контакти з 8 поверхнями; б) КРУ на пальцях після кожного поверхневого контакту

Потім я мажу пальцем учасника і вимірюю бактерії на кінчику пальця після кожного контакту. Потім вони використовують a новим пальцем, щоб торкнутися різної кількості поверхонь тощо від 1 до 8 контактів (див. Рисунок б).

Ось реальні дані: реальні дані

Дані ненормальні, тому дивіться граничний розподіл бактерій | NumberContacts нижче. х = бактерії. Кожна грань - це різна кількість контактів.

введіть тут опис зображення

МОДЕЛЬ

Спроба lme4 :: glmer на основі пропозицій амеби, використовуючи Gamma (link = "log") та поліном для NumberContacts:

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

NB. Гамма (link = "зворотний") не буде працювати, кажучи, що PIRLS ступінчастістю не вдалося зменшити відхилення.

Результати:

Встановлений проти залишків для cfug введіть тут опис зображення

qqp (залишок (cfug))

введіть тут опис зображення

Питання:

Чи правильно визначена моя модель glmer для включення випадкових ефектів кожного учасника і того факту, що всі роблять обидва експерименти A з подальшим експериментом B ?

Доповнення:

Автокореляція, здається, існує між учасниками. Це, мабуть, тому, що вони не проходили тестування в один і той же день, і колба бактерій росте і зменшується з часом. Це важливо?

acf (CFU, відставання = 35) показує значну кореляцію між одним учасником та наступним.

введіть тут опис зображення


1
Ви можете використовувати NumberContactsяк числовий множник і включати квадратичний / кубічний многочлен. Або подивіться узагальнені додаткові змішані моделі.
амеба

1
@amoeba Дякую за допомогу. Усі учасники зробили B (неглазаний), а за ним A (в рукавиці). Як ви вважаєте, чи є інші фундаментальні проблеми з аналізом? Якщо так, я відкритий для будь-яких подальших відповідей.
HCAI

1
Якщо так, то можна включити випадковий ефект рукавички. Крім того, я не розумію, чому ви видаляєте випадковий перехоплення і чому ви не включаєте весь многочлен другого ступеня у випадкову частину. І ви можете мати рукавичку * num взаємодію. То чому б ні CFU ~ Gloves * poly(NumberContacts,2) + (Gloves * poly(NumberContacts,2) | Participant)чи щось подібне.
амеба

1
О, я розумію про перехоплення, але тоді вам також потрібно буде придушити фіксований перехоплення. Також для нульових контактів у вас повинен бути нульовий CFU, але при log-link це не має сенсу. І ви ніде не знаходитесь поблизу нульового ОЗУ за 1 контакт. Тож я б не пригнічував перехоплення. Не сходиться не добре, спробуйте вилучити взаємодію зі випадкової частини: CFU ~ Gloves * poly(NumberContacts,2) + (Gloves + poly(NumberContacts,2) | Participant)або, можливо, видаліть Рукавички звідти CFU ~ Gloves * poly(NumberContacts,2) + (poly(NumberContacts,2) | Participant)...
amoeba

1
Я думаю Gloves * poly(NumberContacts,2) + (poly(NumberContacts,2) | Participant), що це досить пристойна модель.
амеба

Відповіді:


6

Деякі сюжети для вивчення даних

Нижче - вісім, по одному на кожну кількість поверхневих контактів, сюжети xy, що показують рукавички проти рукавичок.

Кожна людина зображена крапкою. Середнє значення та дисперсія та коваріація позначаються червоною крапкою та еліпсом (відстань махаланобіса, що відповідає 97,5% населення).

Ви можете бачити, що ефекти лише невеликі порівняно з поширенням населення. Середнє значення вище для "без рукавичок", а середнє змінюється трохи вище в порівнянні з більш поверхневими контактами (що може бути значним). Але ефект має невеликі розміри (загальний а14скорочення журналу), і є багато людей, для яких насправді більший кількість бактерій з рукавичками.

Невелике співвідношення показує, що дійсно є випадковий ефект від осіб (якщо не було ефекту від людини, то не повинно бути кореляції між парними рукавичками та відсутністю рукавичок). Але це лише невеликий ефект і людина може мати різні випадкові ефекти для "рукавичок" і "без рукавичок" (наприклад, для всіх різних контактних точок у індивіда можуть бути постійно більші / менші показники для "рукавичок", ніж "без рукавичок") .

xy сюжети з рукавичками та без них

Нижче ділянки - окремі ділянки для кожної з 35 особин. Ідея цього сюжету полягає в тому, щоб зрозуміти, чи поведінка однорідна, а також побачити, яка функція здається підходящою.

Зауважте, що "без рукавичок" червоного кольору. У більшості випадків червона лінія вище, більше бактерій для випадків "без рукавичок".

Я вважаю, що лінійного сюжету має бути достатньо, щоб відобразити тут тенденції. Недоліком квадратичного сюжету є те, що коефіцієнти будуть важче інтерпретувати (ви не побачите прямо, чи нахил позитивний чи негативний, оскільки як лінійний член, так і квадратичний член впливають на це).

Але ще важливіше, що ви бачите, що тенденції сильно відрізняються між різними особами, і тому може бути корисним додати випадковий ефект не тільки для перехоплення, але і нахилу людини.

сюжети для кожної людини

Модель

З наведеною нижче моделлю

  • Кожна людина отримає власну криву (випадкові ефекти для лінійних коефіцієнтів).
  • Модель використовує дані, трансформовані журналом, і відповідає звичайній (гауссовій) лінійній моделі. У коментарях амеба згадував, що посилання на журнал не пов'язане з лонормальним розподілом. Але це інакше.уN(журнал(мк),σ2) відрізняється від журнал(у)N(мк,σ2)
  • Ваги застосовуються, оскільки дані гетероскдастичні. Варіація більш вузька до більшої кількості. Це, мабуть, тому, що кількість бактерій має деяку стелю, і відхилення в основному пов'язані з нестачею передачі від поверхні до пальця (= пов'язана з меншими показниками). Дивіться також у 35 сюжетах. В основному є кілька осіб, для яких варіація значно більша, ніж у інших. (ми також бачимо більші хвости, перенапруження в qq-графіках)
  • Не використовується термін перехоплення і додається термін "контраст". Це робиться для полегшення інтерпретації коефіцієнтів.

.

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)

Це дає

> 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

залишки

код для отримання сюжетів

хіміометрія :: функція 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()
}

5 х 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))
}

2 х 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')
}

Дякую тобі, Мартійн, ти так чітко пояснив речі. Дивовижний! Оскільки виграш закінчився ще до того, як я міг його призначити, я дуже хотів би запропонувати вам окрему суму (я перегляну, як це зробити зараз). У мене є деякі запити, але: по-перше, трансформація даних, схоже, є шкільною думкою: Деякі погоджуються & деякі жорстоко не згодні. Чому тут все нормально? По-друге, чому усунення випадкового перехоплення полегшує інтерпретацію коефіцієнтів?
HCAI

(2) Я думаю, що перетворення нормально, коли ви можете стверджувати, що існує процес, який робить перетворення логічним (справді неохоче трансформується, тому що результати виглядають красиво, це можна розглядати як маніпулювання даними та неправильне представлення результатів, а також не отримання базових даних модель)
Секст Емпірік

Я бачу @Martijn, принаймні, в біології перетворення log10 є звичайним для бактерій. Я радий дати нагороду, ти це заслужив. Не хотіли б трохи розібратися, чому ви використовуєте цей "контрастний термін", будь ласка?
HCAI

1
Щодо контрасту Дивіться тут stats.stackexchange.com/a/308644/164061 У вас є свобода переміщати термін перехоплення. Один, можливо, корисний спосіб - встановити перехоплення між двома категоріями і нехай ефект буде різницею між двома ефектами (один буде негативним, а другий позитивним) відносно цього середнього терміна перехоплення. (не те, що мені довелося додати змінну для цього)
Sextus Empiricus

1
В ідеалі, ви б мали методи лікування, що розподіляються випадковим чином у часі, так що будь-які можливі наслідки через зміни часу нівелюються. Але я фактично не бачу стільки автокореляції. Ви маєте на увазі такі стрибки, як у учасника 5 між 5 та 6 кількістю контактів, після яких лінія знову стабільна? Я думаю, що це не так вже й погано і в більшості випадків додає шуму, але не заважає вашому методу (за винятком того, що сигнал / шум буде низьким). Ви можете бути більш впевненими, коли не бачите систематичних змін у часі. Якщо ви обробляли учасників на замовлення, то ви могли б визначити середній рівень їх ОВК з часом.
Секст Емпірік

2

По-перше, хороша робота над вашим графіком; це дає чітке подання даних, тож ви вже можете бачити вигляд шаблону в даних на основі кількості контактів та використання чи відсутності рукавичок. Дивлячись на цей графік, я думаю, що ви отримаєте хороші результати за допомогою базової логічно-поліноміальної моделі із випадковими ефектами для учасників. Обрана вами модель виглядає розумною, але ви можете також розглянути можливість додавання квадратичного терміна для кількості контактів.

Щодо використання MASS:glmmPQLчи lme4:glmerдля вашої моделі, я розумію, що обидві ці функції будуть відповідати одній і тій же моделі (доки ви встановлюєте однакове рівняння моделі, функцію розподілу та зв’язку), але вони використовують різні методи оцінки, щоб знайти відповідну. Я можу помилитися, але моє розуміння з документації полягає в тому, що glmmPQLвикористовується пенізована квазіімовірність, як описано в Wolfinger та O'Connell (1993) , тоді як glmerвикористовується квадратура Гаусса-Ерміта. Якщо ви турбуєтесь про це, ви можете встановити вашу модель обома методами та перевірити, чи вони дають однакові оцінки коефіцієнтів, і таким чином ви будете мати більшу впевненість у тому, що алгоритм підгонки зблизився з справжніми MLE-коефіцієнтами.


Чи повинен NumberContactsбути категоричним фактором?

Ця змінна має природне впорядкування, яке з'являється у ваших графіків, щоб вони мали рівний взаємозв'язок зі змінною відповіді, тому ви могли розумно трактувати її як числову змінну. Якщо ви повинні включити його, factor(NumberContacts)то ви не обмежите його форму, і ви не втратите багато ступенів свободи. Ви навіть можете використовувати взаємодію, Gloves*factor(NumberContacts)не втрачаючи занадто багато ступенів свободи. Однак варто подумати, чи буде використовувати факторну змінну, що передбачає надмірну кількість даних. Зважаючи на те, що у вашому сюжеті є досить плавні взаємозв'язки, проста лінійна функція або квадратична допоможе отримати хороші результати без надмірної підгонки.


Як зробити Participantвипадковий нахил, але не перехоплювати змінну?

Ви вже розмістили свою змінну відповідей у ​​масштабі журналу, використовуючи функцію логарифмічного зв’язку, тому ефект перехоплення Participantнадає мультиплікативний ефект на відповідь. Якби ви наділили цей випадковий нахил, який взаємодіє з NumberContactsним, він би впливав на потужність на відповідь. Якщо ви хочете цього, то ви можете отримати його, (~ -1 + NumberContacts|Participant)який видалить перехоплення, але додасть нахил залежно від кількості контактів.


Чи варто використовувати Box-Cox для перетворення своїх даних? (наприклад, лямбда = 0,779)

Якщо ви сумніваєтесь, спробуйте пристосувати модель до цієї трансформації і подивіться, як вона порівнюється з іншими моделями, використовуючи відповідні статистичні показники корисності. Якщо ви збираєтеся використовувати це перетворення, то краще залишити параметрλ як вільний параметр, і нехай він буде оцінюватися як частина вашої моделі, а не зазначати значення.


Чи слід включати ваги для відхилення?

По-перше, переглянувши свій залишковий сюжет, щоб побачити, чи є дані про гетероскедастичність. На основі сюжетів, які ви вже включили, мені здається, що це не проблема, тому вам не потрібно додавати ваги для дисперсії. Якщо ви сумніваєтесь, ви можете додати ваги, використовуючи просту лінійну функцію, а потім виконати статистичний тест, щоб побачити, чи нахил ваги рівний. Це означало б офіційний тест на гетероседастичність, який би дав вам резервну копію для вашого вибору.


Чи слід включати автокореляцію в NumberContacts?

Якщо ви вже включили термін випадкового ефекту для учасника, то, ймовірно, буде поганою ідеєю додати термін автокореляції на кількість контактів. У вашому експерименті використовується інший палець для різної кількості контактів, щоб ви не очікували автокореляції у випадку, коли ви вже зараховували учасника. Додавання терміна автокореляції на додаток до ефекту учасника означало б, що ви вважаєте, що між результатом різних пальців існує умовна залежність, виходячи з кількості контактів навіть для даного учасника.


Ваш графік добре демонструє взаємозв'язки, але ви можете його естетично покращити, додавши інформацію про заголовок та підзаголовки та надаючи кращі позначки на осі. Ви також можете спростити свою легенду, видаливши її назву та змінивши "Так" на "Рукавички" та "Ні" на "Без рукавичок".


Дякую, це чудова відповідь! Врешті-решт я спробував Gamma (link = "log"), і glmer сходиться без нарікань, ура! glmer (CFU ~ Рукавички + poly (NumberContacts, 2) + (-1 + NumberContacts | Учасник), data = na.omit (підмножина (K, CFU <4,5e5 & Surface == "P")), сімейство = Gamma ( link = "журнал")). QQplot, я думаю, що це нормально (нічого, крім CI), але пристосований проти Rediduals є виворітним (див. Доданий рис, доданий після публікації цього коментаря у випадку, якщо він не відповідає). Чи варто мені надто турбуватися про це?
HCAI

1
Сюжет QQ мені добре виглядає. Також пам’ятайте, що в GLM залишки Пірсона не обов'язково дотримуються нормального розподілу. Схоже, у вас хороший аналіз.
Бен - Відновити Моніку

1

Дійсно, доцільно стверджувати, що вимірювання, проведені у одного учасника, не є незалежними від вимірювань, проведених від іншого учасника. Наприклад, деякі люди можуть прагнути натискати пальцем з більшою (або меншою) силою, що впливатиме на всі їх вимірювання протягом кожної кількості контактів.

Таким чином, двостороння повторна міра ANOVA була б прийнятною моделлю для застосування в цьому випадку.

Крім того, можна також застосувати модель змішаних ефектів із participantвипадковим фактором. Це більш вдосконалене і більш досконале рішення.


Дякую, Михайле, ти абсолютно прав щодо тиску. Хм, я читав про модель змішаних ефектів тут rcompanion.org/handbook/I_09.html, але не впевнений у взаємодії та вкладених факторах. Чи вкладені мої фактори?
HCAI

Я також повинен зазначити, що дані зазвичай не поширюються для кожного контакту, тому я розглянув моделювання санкціонованого квазіімовірності (PQL): ase.tufts.edu/gsc/gradresources/guidetomixedmodelsinr/… . Ви вважаєте, що це вдалий вибір?
HCAI
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.