여러 표면 접촉 후 손가락에서 박테리아가 발견됨 : 비정규 데이터, 반복 측정, 교차 참가자


9

소개

두 가지 조건 ( E = 장갑 착용, B = 장갑 없음) 에서 대장균으로 오염 된 표면에 반복적으로 접촉하는 참가자가 있습니다 . 장갑의 유무에 관계없이 손가락 끝의 박테리아 양과 접촉 횟수 사이에 차이가 있는지 알고 싶습니다. 두 가지 요소 모두 참가자 내에 있습니다.

실험 방법 :

참가자 (n = 35)는 동일한 손가락으로 각 정사각형을 한 번만 터치하여 최대 8 개의 접점을 만듭니다 (그림 a 참조). a) 8 개의 표면이있는 손가락 접촉 b) 각 표면이 접촉 한 후 손가락의 CFU

그런 다음 참가자의 손가락을 면봉하고 접촉 할 때마다 손가락 끝의 박테리아를 측정합니다. 그런 다음 손가락을 사용하여 1 ~ 8 개의 접점과 다른 수의 표면을 만집니다 (그림 b 참조).

실제 데이터는 다음과 같습니다. 실제 데이터

데이터는 비정규이므로 박테리아의 한계 분포는 아래를 참조하십시오. x = 박테리아. 각 패싯은 서로 다른 접점 수입니다.

여기에 이미지 설명을 입력하십시오

모델

NumberMetacts 에 감마 (link = "log") 및 다항식을 사용한 amoeba의 제안에 따라 lme4 :: glmer 에서 시도 :

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

NB. 감마 (link = "inverse")는 PIRLS step-halving이 이탈을 줄이지 않았다는 말을하지 않습니다.

결과 :

cfug의 적합 대 잔차 여기에 이미지 설명을 입력하십시오

qqp (잔류 물 (cfug))

여기에 이미지 설명을 입력하십시오

질문:

각 참가자의 임의 효과와 모든 사람이 실험 A 와 실험 B 를 모두 수행한다는 사실을 통합하기 위해 내 글머 모델이 올바르게 정의되어 있습니까?

부가:

자기 상관은 참가자들 사이에 존재하는 것으로 보인다. 같은 날 테스트를 거치지 않았고 시간이 지남에 따라 박테리아 플라스크가 자라서 줄어들 기 때문일 수 있습니다. 그게 그렇게 중요한 건가?

acf (CFU, lag = 35)는 한 참가자와 다음 참가자 사이의 중요한 상관 관계를 보여줍니다.

여기에 이미지 설명을 입력하십시오


1
NumberContacts수치 요소로 사용 하고 2 차 / 입방 다항식 항을 포함 할 수 있습니다 . 또는 일반 첨가 혼합 모델을 살펴보십시오.
amoeba

1
@amoeba 도와 주셔서 감사합니다. 모든 참가자는 B (무사)와 A (무역)를했습니다. 분석에 다른 근본적인 문제가 있다고 생각하십니까? 그렇다면 더 이상의 답변을 얻을 수 있습니다.
HCAI

1
그렇다면 장갑의 무작위 효과를 포함시킬 수 있습니다. 또한 왜 임의 절편을 제거하고 왜 임의 부분에 2 차 다항식을 포함하지 않는지 이해하지 못합니다. 그리고 당신은 장갑 * 숫자 상호 작용을 가질 수 있습니다. 왜 이렇게 CFU ~ Gloves * poly(NumberContacts,2) + (Gloves * poly(NumberContacts,2) | Participant)나처럼 뭔가.
amoeba

1
오, 나는 요격에 대해 이해하지만 고정 요격도 억제해야합니다. 또한 접점이없는 경우 CFU가 0이지만 로그 링크를 사용하면 의미가 없습니다. 그리고 한 번의 접촉으로 CFU가 0에 가까운 곳은 없습니다. 그래서 나는 가로 채기를 억제 하지 않을 것이다 . : 수렴하지 않음 좋지 않다, 임의의 부분에서의 상호 작용을 제거하려고 CFU ~ Gloves * poly(NumberContacts,2) + (Gloves + poly(NumberContacts,2) | Participant), 아니면 거기에서 장갑을 벗고 CFU ~ Gloves * poly(NumberContacts,2) + (poly(NumberContacts,2) | Participant)...
아메바

1
Gloves * poly(NumberContacts,2) + (poly(NumberContacts,2) | Participant)꽤 괜찮은 모델 이라고 생각 합니다.
amoeba

답변:


6

데이터를 탐색하기위한 일부 도표

아래는 장갑을 표시하고 장갑을 표시하지 않는 xy 플롯입니다.

각 개인은 점으로 표시됩니다. 평균과 분산 및 공분산은 빨간색 점과 타원 (인구의 97.5 %에 해당하는 마할 라 노비스 거리)으로 표시됩니다.

인구 확산과 비교할 때 그 효과가 작다는 것을 알 수 있습니다. '장갑 없음'의 경우 평균이 높고 표면 접촉이 많을수록 평균이 약간 높아집니다 (중요한 것으로 표시 될 수 있음). 그러나 그 효과는 크기가 작습니다.14) 감소를 기록, 실제로 높은 박테리아 카운트가 누구인지에 대한 많은 사람들이 있습니다 장갑은.

작은 상관 관계는 실제로 개인으로부터 임의의 효과가 있음을 보여줍니다 (사람의 영향이 없다면 쌍 장갑과 장갑이 없음). 그러나 이는 작은 효과 일 뿐이며 개인은 '장갑'과 '장갑 없음'에 대해 다른 임의의 효과를 가질 수 있습니다 (예 : 모든 다른 접점의 경우 개인은 '장갑 없음'보다 '장갑'에 대해 지속적으로 높거나 낮은 수를 가질 수 있음) .

장갑의 유무에 관계없이 xy 도표

아래 그림은 35 명 각각에 대한 별도의 그림입니다. 이 그림의 개념은 동작이 동종인지 확인하고 어떤 기능이 적합한 지 확인하는 것입니다.

'장갑 없음'은 빨간색입니다. 대부분의 경우 레드 라인이 높고 '장갑이없는'경우에 더 많은 박테리아가 있습니다.

나는 추세를 포착하기에 선형 플롯이 충분해야한다고 생각합니다. 2 차 그림의 단점은 계수를 해석하기가 더 어렵다는 것입니다 (선형 항과 2 차 항이 모두 영향을 미치기 때문에 기울기가 양수인지 음수인지 직접 볼 수는 없습니다).

그러나 더 중요한 것은 추세가 개인마다 많이 다르므로 인터셉트뿐만 아니라 개인의 기울기에 무작위 효과를 추가하는 것이 유용 할 수 있다는 것을 알 수 있습니다.

각 개인에 대한 음모

모델

아래 모델로

  • 각 개인은 자신의 곡선을 맞출 것입니다 (선형 계수에 대한 임의 효과).
  • 이 모델은 로그 변환 된 데이터를 사용하며 일반 (가우시안) 선형 모델에 적합합니다. 의견에서 amoeba는 로그 링크가 로그 정규 분포와 관련이 없다고 언급했습니다. 그러나 이것은 다릅니다.와이(로그(μ),σ2) ~와 다르다 로그(와이)(μ,σ2)
  • 데이터가이 분산이기 때문에 가중치가 적용됩니다. 숫자가 클수록 변동이 더 좁습니다. 이것은 아마도 박테리아 수에 약간의 천장이 있고 그 변화는 대부분 표면에서 손가락으로의 전달이 실패하기 때문일 것입니다 (= 낮은 수와 관련됨). 35 플롯에서 참조하십시오. 변화가 다른 사람들보다 훨씬 높은 개인이 주로 있습니다. (우리는 qq-plots에서 더 큰 꼬리, 과도한 분산을 볼 수 있습니다)
  • 인터셉트 용어가 사용되지 않고 '대비'용어가 추가됩니다. 이것은 계수를 더 쉽게 해석하기 위해 수행됩니다.

.

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

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

Martijn 너무 감사합니다, 당신은 일을 너무 명확하게 설명했습니다. 놀랄 만한! 현상금을 할당하기 전에 바운티가 완료되었으므로 별도의 금액을 제공하고 싶습니다 (지금이 방법을 살펴 보겠습니다). 그래도 몇 가지 질문이 있습니다. 첫째, 데이터 변환에는 생각의 학교가있는 것 같습니다 : 일부는 동의하고 일부는 동의하지 않습니다. 왜 여기 괜찮아? 둘째, 왜 랜덤 절편을 제거하면 계수를 더 쉽게 해석 할 수 있습니까?
HCAI

(2) 변환을 논리적으로 만드는 프로세스가 있다고 주장 할 수있을 때 변환이 정상이라고 생각합니다 (결과가 멋지게 보이기 때문에 마지 못해 변환하는 것은 데이터 조작 및 결과를 잘못 표현할뿐만 아니라 기본을 얻지 못하는 것으로 볼 수 있음) 모델)
섹스 투스 엠피 리 쿠스

나는 @Martijn을 보았습니다. 적어도 log10에 의한 생물학 변형은 박테리아에 일반적입니다. 현상금을 제공하게되어 기쁩니다. 이 "대비 용어"를 사용하는 이유에 대해 좀 더 자세히 설명해 주시겠습니까?
HCAI

1
대비에 대해서는 여기를 참조하십시오. stats.stackexchange.com/a/308644/164061 인터셉트 용어를 자유롭게 이동할 수 있습니다. 한 가지 유용한 방법은 두 범주 사이에 절편을 설정하고 그 효과가 해당 평균 절편 항에 대한 두 효과 간의 차이 (하나는 다른 쪽은 음일 것임)입니다. (나는 이것을 위해 변수를 추가하지 않아도 됨)
Sextus Empiricus

1
이상적으로는 시간의 변화에 ​​따른 가능한 효과가 평준화 될 수 있도록 시간에 따라 무작위로 치료를 분배하는 것이 좋습니다. 그러나 실제로는 많은 자기 상관이 보이지 않습니다. 5 번과 6 번의 접점 수 사이에 참가자 5에서와 같이 점프 한 후에 회선이 다시 안정 되었습니까? 나는 이것들이 그렇게 나쁘지 않고 최대의 노이즈를 추가하지만 귀하의 방법을 방해하지 않는다고 생각합니다 (신호 / 잡음을 낮추는 것 제외). 시간이 지남에 따라 체계적인 변화가 보이지 않을 때 더 확신 할 수 있습니다. 참가자를 순서대로 처리 한 경우 시간이 지남에 따라 평균 CFU를 플로팅 할 수 있습니다.
Sextus Empiricus

2

첫째, 그래프 작업은 훌륭합니다. 데이터의 명확한 표현을 제공하므로 접점 수와 장갑 사용 여부에 따라 데이터의 패턴을 이미 볼 수 있습니다. 이 그래프를 보면 참가자에게 임의의 영향을 미치는 기본 로그 다항식 모델로 좋은 결과를 얻을 수 있다고 생각합니다. 선택한 모델이 합리적으로 보이지만 접점 수에 2 차 항을 추가하는 것도 고려할 수 있습니다.

모델 을 사용할지 MASS:glmmPQL또는 lme4:glmer모델 을 사용할 지에 대한 이해는 두 함수가 모두 동일한 모델에 적합하지만 (모델 방정식, 분포 및 링크 함수를 동일하게 설정하는 한) 서로 다른 추정 방법을 사용하여 적합도를 찾는 것입니다. 나는 잘못 생각할 수 있지만 Wolfinger and O'Connell (1993)에glmmPQL 설명 된 것처럼 불이익을 준 유사 가능성을 사용 하는 반면 Gauss-Hermite quadrature 를 사용 한다는 것이 문서에서 이해합니다 . 걱정이되는 경우 두 방법을 모두 사용하여 모형을 적합시킬 수 있고 이들이 동일한 계수 추정치를 제공하는지 확인할 수 있으며, 이렇게하면 피팅 알고리즘이 계수의 실제 MLE로 수렴되었다는 확신이 커집니다.glmer


NumberContacts범주 형 요소 여야합니까 ?

이 변수는 플롯에서 반응 변수와의 원활한 관계를 나타내는 자연스러운 순서를 가지므로 숫자 변수로 합리적으로 처리 할 수 ​​있습니다. 당신이 포함 factor(NumberContacts)한다면, 당신은 그것의 형태를 제한하지 않을 것이고 당신은 많은 자유도를 잃지 않을 것입니다. Gloves*factor(NumberContacts)너무 많은 자유도를 잃지 않고 상호 작용 을 사용할 수도 있습니다 . 그러나 요인 변수를 사용하면 데이터가 과적 합되는지 여부를 고려해야합니다. 플롯에 상당히 부드러운 관계가 있다고 가정하면 간단한 선형 함수 또는 2 차는 과적 합없이 좋은 결과를 얻을 수 있습니다.


Participant랜덤 슬로프를 만들지 만 변수를 가로 채지 않는 방법은 무엇입니까?

로그 링크 함수를 사용하여 응답 변수를 로그 스케일에 이미 설정 했으므로 인터셉트 효과 Participant는 응답에 곱하기 효과를줍니다. 이것과 상호 작용하는 임의의 기울기를 주면 NumberContacts반응에 전력 기반의 영향을 미칩니다. 원하는 경우 (~ -1 + NumberContacts|Participant)절편을 제거하지만 접점 수를 기반으로 경사를 추가 할 수 있습니다.


데이터 변환에 Box-Cox를 사용해야합니까? (예 : lambda = 0.779)

확실하지 않은 경우이 변환을 사용하여 모형을 피팅하고 적절한 적합도 통계량을 사용하여 다른 모형과 비교하는 방법을 확인하십시오. 이 변환을 사용하려는 경우 매개 변수를 그대로 두는 것이 좋습니다λ 값을 미리 지정하지 않고 모델의 일부로 추정 할 수 있습니다.


분산에 가중치를 포함해야합니까?

이분산성의 증거가 있는지 알아보기 위해 잔차 그림을 살펴 보는 것으로 시작하십시오. 이미 포함시킨 플롯을 기반으로, 이것이 문제가 아닌 것처럼 보이므로 분산에 가중치를 추가 할 필요가 없습니다. 의심스러운 경우 간단한 선형 함수를 사용하여 가중치를 추가 한 다음 통계 테스트를 수행하여 가중치의 기울기가 평평한 지 확인할 수 있습니다. 그것은 이분산성에 대한 공식적인 테스트에 해당하며, 이것은 당신에게 당신의 선택에 대한 약간의 백업을 줄 것입니다.


자기 상관을에 포함시켜야 NumberContacts합니까?

참가자에 대해 임의의 효과 용어를 이미 포함한 경우 연락처 수에 자동 상관 용어를 추가하는 것은 좋지 않습니다. 실험에서는 여러 연락처에 다른 손가락을 사용하므로 이미 참가자를 설명한 경우 자동 상관을 기대하지 않습니다. 참가자 효과 외에 자기 상관 용어를 추가하면 특정 참가자에 대한 접촉 수에 따라 다른 손가락의 결과간에 조건부 의존이 있다고 생각할 수 있습니다.


그래프는 관계를 잘 보여 주지만 제목과 자막 정보를 추가하고 더 나은 축 레이블을 제공함으로써 미적으로 향상시킬 수 있습니다. 제목을 제거하고 '예'를 '장갑'으로, '아니오'를 '장갑 없음'으로 변경하여 범례를 단순화 할 수도 있습니다.


감사합니다. 놀라운 답변입니다! 결국 나는 Gamma (link = "log")를 시도했고 글머 머는 불만없이 수렴합니다. glmer (CFU ~ 장갑 + 폴리 (번호 연락처, 2) + (-1 + 번호 연락처 | 참가자), data = na.omit (subset (K, CFU <4.5e5 & Surface == "P")), family = Gamma ( link = "log")). QQplot 괜찮습니다 (CI 외부에는 없음).하지만 맞는 대 rediduals는 깔때기입니다 (이 의견이 일치하지 않는 경우 게시 된 후 추가 된 그림 참조). 그것에 대해 너무 귀찮게해야합니까?
HCAI

1
QQ 플롯은 나에게 잘 보입니다. 또한 GLM에서 Pearson 잔차가 정규 분포를 반드시 따르는 것은 아닙니다. 분석이 잘 된 것 같습니다.
벤 – 복원 모니카

1

실제로 한 참가자의 측정 값이 다른 참가자의 측정 값과 독립적이 아니라고 주장하는 것이 합리적입니다. 예를 들어, 어떤 사람들은 더 많은 (또는 더 적은) 힘으로 손가락을 누르는 경향이 있으며, 이는 각 접촉 수에 대한 모든 측정에 영향을 미칩니다.

따라서 2-way 반복 측정 ANOVA는이 경우에 적용 가능한 모델입니다.

또는 participant임의의 요인으로 혼합 효과 모델을 적용 할 수도 있습니다 . 이것은 더욱 발전된 솔루션입니다.


미하엘 감사합니다, 당신은 압력에 절대적으로 맞습니다. 흠 나는 혼합 효과 모델 에 대해 rcompanion.org/handbook/I_09.html 에 대해 읽었 지만 상호 작용과 중첩 된 요소에 대해서는 확실하지 않습니다. 내 요인이 중첩되어 있습니까?
HCAI

또한 데이터가 각 컨택에 대해 일반적으로 분배되지 않으므로 PQL ( Penized Quasi-likelihood) 모델링을 살펴 보았습니다 . ase.tufts.edu/gsc/gradresources/guidetomixedmodelsinr/… . 이것이 좋은 선택이라고 생각하십니까?
HCAI
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.