R

多次表面接觸後手指上的細菌:非正常數據、重複測量、交叉參與者

  • August 15, 2018

介紹

我有參與者在兩種情況下反復接觸大腸桿菌污染的表面(A = 戴手套,B = 不戴手套)。我想知道戴手套和不戴手套時指尖上的細菌數量是否存在差異,以及接觸次數之間是否存在差異。這兩個因素都在參與者內部。

實驗方法:

參與者(n=35)用同一根手指觸摸每個方格一次,最多接觸 8 次(見圖 a)。 a) 手指接觸 8 個表面,b) 每次接觸表面後手指上的 CFU

然後我用棉籤擦拭參與者的手指,並在每次接觸後測量指尖上的細菌。然後他們使用手指觸摸不同數量的表面,依此類推,從 1 到 8 個觸點(見圖 b)。

這是真實數據:真實數據

數據是非正態的,因此請參閱下面的細菌邊緣分佈|NumberContacts。x=細菌。每個方面是不同數量的聯繫人。

在此處輸入圖像描述

模型

根據變形蟲的建議從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)

注意。Gamma(link=“inverse”) 不會運行說 PIRLS 減半未能減少偏差。

結果:

cfug的擬合與殘差 在此處輸入圖像描述

qqp(resid(cfug))

在此處輸入圖像描述

題:

我的 glmer 模型是否正確定義以包含每個參與者的隨機效應以及每個人都做實驗A和實驗B的事實?

添加:

參與者之間似乎存在自相關。這可能是因為它們沒有在同一天進行測試,並且細菌瓶會隨著時間的推移而生長和減少。有關係嗎?

acf(CFU,lag=35) 顯示了一個參與者和下一個參與者之間的顯著相關性。

在此處輸入圖像描述

一些用於探索數據的圖

下面是八個,每個表面接觸數量一個,xy 圖顯示手套與不戴手套。

每個人都用一個點繪製。均值、方差和協方差用紅點和橢圓表示(馬氏距離對應於 97.5% 的總體)。

您可以看到,與人口分佈相比,影響很小。“不戴手套”的平均值更高,而更多表面接觸的平均值會更高(這可以證明是顯著的)。但效果只是很小(總體而言log 減少),並且有很多人實際上戴手套的細菌數量更高

小的相關性表明確實存在來自個人的隨機效應(如果沒有來自人的影響,那麼配對手套和不戴手套之間應該沒有相關性)。但這只是一個很小的影響,個人可能對“手套”和“不戴手套”有不同的隨機影響(例如,對於所有不同的接觸點,個人對“手套”的計數可能始終高於/低於“不戴手套”) .

戴手套和不戴手套的 xy 圖

下圖是 35 個人中每個人的單獨圖。這個圖的想法是看行為是否是同質的,也看什麼樣的函數看起來合適。

請注意,“不戴手套”是紅色的。在大多數情況下,紅線越高,“不戴手套”的情況下細菌越多。

我相信線性圖應該足以捕捉這裡的趨勢。二次圖的缺點是係數將更難以解釋(您不會直接看到斜率是正數還是負數,因為線性項和二次項都會對此產生影響)。

但更重要的是,您會看到不同個體之間的趨勢差異很大,因此為截距和個體斜率添加隨機效應可能很有用。

每個人的地塊

模型

使用下面的模型

  • 每個人都會得到自己的曲線擬合(線性係數的隨機效應)。
  • 該模型使用對數轉換的數據並適合常規(高斯)線性模型。在評論中變形蟲提到日誌鏈接與對數正態分佈無關。但這是不同的。不同於
  • 應用權重是因為數據是異方差的。數字越大,變化越窄。這可能是因為細菌計數有一定的上限,而變化主要是由於從表面到手指的傳播失敗(= 與較低的計數有關)。另見 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

QQ圖

殘差

獲取繪圖的代碼

化學計量學::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')
}

引用自:https://stats.stackexchange.com/questions/362306

comments powered by Disqus