複数の表面接触後に指で拾った細菌:非正常データ、反復測定、交差した参加者


9

はじめに

2つの条件(A =手袋を着用、B =手袋を着用しない)で、汚染された表面に大腸菌を繰り返し接触している参加者がいます。手袋をした場合と使用しない場合の指先の細菌の量に違いがあるかどうか、また接触の数に違いがあるかどうかを知りたいです。どちらの要素も参加者内にあります。

実験方法:

参加者(n = 35)は、同じ指で各正方形に1回タッチして、最大8つのコンタクトを作成します(図aを参照)。 a)8つの表面との指の接触、b)各表面接触後の指のCFU

次に、参加者の指を拭いて、接触するたびに指先の細菌を測定します。次に、新しい指を使用して、1〜8個の接点など、さまざまな数の表面に触れます(図bを参照)。

これが実際のデータです。実際のデータ

データは正常ではないため、下のバクテリアの分布| NumberContactsを参照してください。x =細菌。各ファセットは異なる数の連絡先です。

ここに画像の説明を入力してください

モデル

NumberContactsにGamma(link = "log")と多項式を使用してアメーバの提案に基づいてlme4 :: glmerから試してみます。

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

NB。GIRA(link = "inverse")は、PIRLSのステップを半分にしても逸脱を減らすことができなかったとは言いません。

結果:

cfugの近似vs残差 ここに画像の説明を入力してください

qqp(resid(cfug))

ここに画像の説明を入力してください

質問:

私のglmerモデルは、各参加者のランダムな効果と、誰もが実験Aに続いて実験Bを行うという事実を組み込むように適切に定義されていますか?

添加:

参加者間には自己相関があるようです。これはおそらく、それらが同じ日にテストされなかったためであり、細菌のフラスコは時間とともに成長し、減少します。それは重要ですか?

acf(CFU、lag = 35)は、ある参加者と次の参加者の間の有意な相関を示しています。

ここに画像の説明を入力してください


1
NumberContacts数値因子として使用し、2次/ 3次多項式項を含めることができます。または、一般化された加法混合モデルを調べます。
アメーバ2018

1
@amoebaご協力ありがとうございます。すべての参加者がB(手袋を外した)に続いてA(手袋をした)を行いました。分析には他にも根本的な問題があると思いますか?もしそうなら、私はさらなる答えを受け入れます。
HCAI 2018

1
もしそうなら、あなたは手袋のランダムな効果を含めることができます。また、ランダムインターセプトを削除する理由と、ランダムな部分に2次多項式全体を含めない理由もわかりません。そして、手袋* numの相互作用を持つことができます。では、なぜそうしないのCFU ~ Gloves * poly(NumberContacts,2) + (Gloves * poly(NumberContacts,2) | Participant)か、またはそのようなものを。
アメーバ2018

1
ああ、私は切片について理解していますが、固定切片も抑制する必要があります。また、連絡先がゼロの場合はCFUがゼロになるはずですが、ログリンクではこれは意味がありません。また、1回の接触でCFUがゼロに近い場所はありません。だから私は切片を抑制しません。収束しないのは良くありません。ランダムな部分から相互作用を削除してみてください: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

データを探索するためのいくつかのプロット

以下は、表面接触の数ごとに1つずつの8つで、xyプロットは手袋と手袋なしを示しています。

各個体はドットでプロットされています。平均と分散および共分散は、赤い点と楕円(母集団の97.5%に対応するマハラノビス距離)で示されます。

14

小さな相関関係は、実際に個人からのランダムな効果があることを示しています(個人からの効果がなかった場合、ペアの手袋と手袋なしの間に相関関係はないはずです)。しかし、それはほんのわずかな影響であり、個人は「手袋」と「手袋なし」で異なるランダム効果を持つ可能性があります(たとえば、すべての異なる接触点で、「手袋」の数は「手袋なし」よりも一貫して高い/低い場合があります) 。

手袋あり/なしのxyプロット

以下のプロットは、35人の個人ごとの個別のプロットです。このプロットの考え方は、動作が均一であるかどうかを確認し、どのような関数が適切であると思われるかを確認することです。

「手袋なし」は赤であることに注意してください。ほとんどの場合、赤い線の方が高く、「手袋なし」の場合は細菌数が多くなります。

ここで傾向を捉えるには、線形プロットで十分だと思います。二次プロットの欠点は、係数の解釈が難しくなることです(線形項と二次項の両方がこれに影響を与えるため、勾配が正か負かを直接見ることはできません)。

しかし、さらに重要なことに、傾向は個人間で大きく異なるため、切片だけでなく個人の勾配にもランダムな効果を追加すると役立つ場合があります。

個人ごとのプロット

型番

以下のモデルで

  • 個人ごとに独自の曲線がフィットします(線形係数のランダム効果)。
  • yN(log(μ),σ2)log(y)N(μ,σ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

残差

プロットを取得するコード

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

マーティンさん、本当にありがとうございました。すごい!バウンティは割り当てる前に終了したので、別の金額を提供したいと思います(これを行う方法については後で説明します)。ただし、クエリはいくつかあります。まず、データを変換することには、さまざまな考え方があります。どうしてここでいいの?次に、ランダムな切片を削除すると係数が解釈しやすくなるのはなぜですか?
HCAI

(2)変換を論理的にするプロセスがあると主張できる場合、変換は問題ないと思います(実際、結果を美しく見せるために不本意に変換することは、データ操作と結果の不正確な表現、および基になるものを取得しないことと見なすことができますモデル)
Sextus Empiricus

@Martijnは、少なくとも生物学では、log10による形質転換が細菌に共通することを理解しています。賞金を差し上げてうれしいです。この「コントラスト用語」を使用する理由を少し詳しく説明していただけませんか。
HCAI 2018

1
対比についてはこちらをご覧くださいstats.stackexchange.com/a/308644/164061切片の項を自由に移動できます。有用な方法の1つは、2つのカテゴリ間の切片を設定し、その平均切片項に対する2つの効果の差(一方は負、もう一方は正)を効果とすることです。(このために変数を追加する必要があったわけではありません)
Sextus Empiricus '26

1
理想的には、時間の変動に起因する可能性のある影響が平準化されるように、時間の経過に応じて処理をランダムに分散させることになります。しかし、実際にはそれほど多くの自己相関は見られません。参加者5の5から6の連絡先の間でジャンプした後、回線が再び安定したことを意味しますか?これらはそれほど悪くはなく、多くてもノイズを追加しますが、メソッドに干渉しません(信号/ノイズを低くすることを除いて)。時間の経過に伴う系統的な変化が見られない場合は、より確実になります。参加者を順番に処理した場合、時間の経過に伴う平均CFUをプロットできます。
Sextus Empiricus

2

モデルを使用するのMASS:glmmPQLlme4:glmer、モデルに使用するのかについては、これらの関数は両方とも同じモデルに適合します(モデルの方程式、分布、リンク関数を同じに設定している限り)が、異なる推定方法を使用して適合を見つけます。私は間違っているかもしれませんが、ドキュメントからの私の理解glmmPQLは、Wolfinger and O'Connell(1993)で説明されているペナルティ付き準尤度をglmer使用するのに対して、Gauss-Hermite求積法を使用することです。それが心配な場合は、両方の方法でモデルを近似し、それらが同じ係数推定値を与えることを確認できます。これにより、近似アルゴリズムが係数の真のMLEに収束したという確信が高まります。


NumberContactsカテゴリー的な要素であるべきですか?

この変数には、応答変数との関係がスムーズになるようにプロットから表示される自然な順序付けがあるため、合理的に数値変数として扱うことができます。含める場合はfactor(NumberContacts)、その形式を制約せず、多くの自由度を失うことはありません。Gloves*factor(NumberContacts)多くの自由度を失うことなく、相互作用を使用することもできます。ただし、因子変数の使用がデータの過剰適合を伴うかどうかを検討する価値があります。プロットにかなり滑らかな関係があることを考えると、単純な線形関数または2次関数は、過剰適合なしで良い結果を得るでしょう。


Participant切片変数ではなくランダムな勾配をどのように作成しますか?

対数リンク関数を使用して、応答変数を対数スケールにすでに配置しているため、の切片効果Participantが応答に乗法効果を与えています。これにランダムなスロープを作用さNumberContactsせると、応答にパワーベースの効果が生じます。これが必要な場合は(~ -1 + NumberContacts|Participant)、切片を削除し、接点の数に基づいて勾配を追加することで取得できます。


データの変換にはBox-Coxを使用する必要がありますか?(例:lambda = 0.779)

λ


分散の重みを含める必要がありますか?

まず、残差プロットを見て、異分散性の証拠があるかどうかを確認します。すでに含まれているプロットに基づいて、これは問題ではないように見えます。そのため、分散の重みを追加する必要はありません。疑わしい場合は、単純な線形関数を使用して重みを追加してから、統計的検定を実行して、重みの傾きが平坦かどうかを確認できます。これは、異分散性の正式なテストに相当します。これは、選択のバックアップを提供します。


に自己相関を含めるべきNumberContactsですか?

参加者にランダム効果用語をすでに含めている場合は、連絡先の数に自己相関用語を追加することはおそらくお勧めできません。実験では、連絡先の数に応じて別の指を使用しているため、参加者をすでに考慮している場合の自己相関は期待できません。参加者の効果に加えて自己相関項を追加すると、特定の参加者であっても、接触の数に基づいて、さまざまな指の結果の間に条件付きの依存関係があると考えることになります。



ありがとう、それは素晴らしい答えです!最後に、私はGamma(link = "log")を試してみましたが、文句を言わずに収束しました。glmer(CFU〜Gloves + poly(NumberContacts、2)+(-1 + NumberContacts | Participant)、data = na.omit(subset(K、CFU <4.5e5&Surface == "P"))、family = Gamma( link = "log"))。QQplotは大丈夫だと思います(CIの外には何もありません)が、適合vs redidualsはファネリングしています(一致しない場合は、このコメントが投稿された後に追加された写真を参照してください)。私はそれについてあまり気にする必要がありますか?
HCAI 2018

1
QQプロットは私には問題なく見えます。また、GLMではピアソン残差が必ずしも正規分布に従うとは限らないことを覚えておいてください。うまく分析できているようです。
ベン-モニカ

1

実際、ある参加者から得られた測定値は、別の参加者から得られた測定値から独立していないと主張するのは理にかなっています。たとえば、一部の人々はより多くの(またはより少ない)力で指を押す傾向があるかもしれません。

したがって、2因子反復測定ANOVAは、この場合に適用できる許容可能なモデルになります。

あるいは、participantランダム因子としての混合効果モデルを適用することもできます。これは、より高度で洗練されたソリューションです。


ミハエルありがとう、あなたはプレッシャーについて完全に正しいです。えーと、ここでrcompanion.org/handbook/I_09.htmlの混合効果モデルについて読んでいましたが、相互作用とネストされた因子についてはわかりませんでした。私の要素はネストされていますか?
HCAI 2018

また、データは連絡先ごとに通常は配布されないため、ペナルティ付き準尤度(PQL)モデリング(ase.tufts.edu/gsc/gradresources/guidetomixedmodelsinr/…)を見てきたことも指摘しておきます。これは良い選択だと思いますか?
HCAI 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.