R lme4またはnlmeパッケージを使用した変量効果の推定とユーザー定義の相関/共分散構造の適用


9

以下の種類のデータがあります。私はそれぞれ10回繰り返された10人の個人を評価しました。私は10x10の関係マトリックス(個人のすべての組み合わせ間の関係)を持っています。

set.seed(1234)
mydata <- data.frame (gen = factor(rep(1:10, each = 10)),
                      repl = factor(rep(1:10, 10)),
                      yld = rnorm(10, 5, 0.5))

この世代はさまざまな種類の植物であるため、それぞれを繰り返し栽培して、収量を測定できます。共分散行列は、個別の実験でibd確率によって計算された遺伝的類似性による関連性の尺度です。

library(lme4)
covmat <- round(nearPD(matrix(runif(100, 0, 0.2), nrow = 10))$mat, 2)
diag(covmat) <- diag(covmat)/10+1
rownames(covmat) <- colnames(covmat) <- levels(mydata$gen)

> covmat                   
10 x 10 Matrix of class "dgeMatrix"                    
      1    2    3    4    5    6    7    8    9   10
1  1.00 0.08 0.06 0.03 0.09 0.09 0.10 0.08 0.07 0.10
2  0.08 1.00 0.08 0.09 0.04 0.12 0.08 0.08 0.11 0.09
3  0.06 0.08 1.00 0.10 0.05 0.09 0.09 0.07 0.04 0.13
4  0.03 0.09 0.10 1.00 0.02 0.11 0.09 0.06 0.04 0.12
5  0.09 0.04 0.05 0.02 1.00 0.06 0.07 0.05 0.02 0.08
6  0.09 0.12 0.09 0.11 0.06 1.00 0.12 0.08 0.07 0.14
7  0.10 0.08 0.09 0.09 0.07 0.12 1.00 0.08 0.03 0.15
8  0.08 0.08 0.07 0.06 0.05 0.08 0.08 1.00 0.06 0.09
9  0.07 0.11 0.04 0.04 0.02 0.07 0.03 0.06 1.00 0.03
10 0.10 0.09 0.13 0.12 0.08 0.14 0.15 0.09 0.03 1.00

私のモデルは:

yld = gen + repl + error 

genとreplの両方がランダムと見なされ、各genに関連付けられた変量効果の見積もりを取得したいのですが、関係行列を考慮する必要があります。

ネストされたモデルに適合させるには複雑すぎる場合は、モデルからreplを削除するだけですが、理想的には保持します。

yld = gen +  error 

おそらくnlmeまたはlme4で、Rパッケージを使用してこれをどのように実現できますか?ASREMLがそれを実行できることは知っていますが、私にはホールドがありません。私はRが堅牢であり、フリーであることを愛しています。


1
アーロン、あなたの考えをありがとう、これについてより強い提案が得られることを願っています...
Ram Sharma

この例は、異なる種類のデータセットを完全に示唆しているため、非常に混乱しています。それは質問と矛盾します。この例を削除するか、現実的な例を提供してください。
whuber

@whuberタイプミスの一部を編集して私のポイントをより明確にしました。希望が助かります
Ram Sharma

@RamSharma:私は自由にサンプル正定共分散行列を作成し、いくつかのマイナーな編集を行いました。重要な変更を加えた場合は、自由に編集して戻ってください。
アーロンがスタックオーバーフローを去った

より多くのビューを取得するには、これをstackoverflowに移行する必要があると思います。私はそれをする方法をしません、誰かが助けることができますか?
ジョン

回答:


6

kinship基づくパッケージを試してくださいnlme。詳細については、r-sig-mixed-modelsのこのスレッドを参照してください。ロジスティックモデルでやろうとしていたので、このことを忘れていました。効果的な例については、https://stackoverflow.com/questions/8245132を参照してください

通常以外の応答の場合は、lme4に基づくpedigreemmパッケージを変更する必要があります。近づきますが、関係行列は家系図から作成する必要があります。以下の関数は、pedigreemm代わりに任意の関係行列を取る関数の変更です。

library(pedigreemm)
relmatmm <- function (formula, data, family = NULL, REML = TRUE, relmat = list(), 
    control = list(), start = NULL, verbose = FALSE, subset, 
    weights, na.action, offset, contrasts = NULL, model = TRUE, 
    x = TRUE, ...) 
{
    mc <- match.call()
    lmerc <- mc
    lmerc[[1]] <- as.name("lmer")
    lmerc$relmat <- NULL
    if (!length(relmat)) 
        return(eval.parent(lmerc))
    stopifnot(is.list(relmat), length(names(relmat)) == length(relmat))
    lmerc$doFit <- FALSE
    lmf <- eval(lmerc, parent.frame())
    relfac <- relmat
    relnms <- names(relmat)
    stopifnot(all(relnms %in% names(lmf$FL$fl)))
    asgn <- attr(lmf$FL$fl, "assign")
    for (i in seq_along(relmat)) {
        tn <- which(match(relnms[i], names(lmf$FL$fl)) == asgn)
        if (length(tn) > 1) 
            stop("a relationship matrix must be associated with only one random effects term")
        Zt <- lmf$FL$trms[[tn]]$Zt
        relmat[[i]] <- Matrix(relmat[[i]][rownames(Zt), rownames(Zt)], 
            sparse = TRUE)
        relfac[[i]] <- chol(relmat[[i]])
        lmf$FL$trms[[tn]]$Zt <- lmf$FL$trms[[tn]]$A <- relfac[[i]] %*% Zt
    }
    ans <- do.call(if (!is.null(lmf$glmFit)) 
        lme4:::glmer_finalize
    else lme4:::lmer_finalize, lmf)
    ans <- new("pedigreemm", relfac = relfac, ans)
    ans@call <- match.call()
    ans
}

使用法は、血統の代わりにpedigreemm関係行列をrelmat引数として与えることを除いて、似ていpedigreeます。

m <- relmatmm(yld ~ (1|gen) + (1|repl), relmat=list(gen=covmat), data=mydata)

これは、10個の観測値/個体があるため、ここでは当てはまりませんが、1つの観測値/個体の場合、この関数にさらに1行と、lme4ランダムな効果ごとに1つの観測のみを許可するマイナーパッチが必要です。


どのように:lme(yld〜1、data = mydata、random =〜gen + repl、correlation = covmat)#公式が与えているエラーであり、相関構造が複製または残差項に適用されるかどうかはわかりませんあなたは考える ?
ジョン

@John:交差ランダム効果は扱いが難しく、nlmeさらに複雑なものが必要ですgen + repl。また、相関はnlmeの共分散/相関関数の1つをcovmatパラメーターとして呼び出す必要があると思います。これの表記は非常にトリッキーなので、もっと言うと、手元にPinhiero / Batesが必要ですが、今日は必要ありません。
アーロンがスタックオーバーフローを去った

次に、repl効果がない場合、lme(yld〜1、data = mydata、random =〜gen、correlation = covmat)はasremlコードと同等または同等であると思いますか:asreml(yld〜1、random =〜gen、ginverse =リスト(gen = inv.covmat)、データ= mydata)、ここでinv.covmatは下三角の融解行列(asreml-rのドキュメントを参照)
John

正しい表記はおそらくのようなものlme(yld ~ 1, data = mydata, random = ~ 1 | gen, correlation = corSymm(value=covmatX, form= ~ gen, fixed=TRUE))です。covmatXは、を変更したバージョンですcovmatが、それをcorSymm望んでいます。formどちらの言葉が正しいのかもよくわかりません。
アーロンがスタックオーバーフローを去った

@アーロン、このパッチは便利ですか?モデルごとにクラスごとに1人の個人を当てはめる必要があることがよくあります...別の質問として質問したいかもしれません...この質問では多すぎるかもしれません
Ram Sharma

4

この答えは、血統を使用することを提案したアーロンの提案を拡張する可能性があります。家系図は次の構文に従ってプロジェクトから関係を計算できますが、このような関係出力をさまざまな方法でどのように使用できるかはわかりません。

# just example from the manual to create pedigree structure and relation matrix 
  # (although you have already the matrix in place) 
p1 <- new("pedigree",
sire = as.integer(c(NA,NA,1, 1,4,5)),
dam = as.integer(c(NA,NA,2,NA,3,2)),
label = as.character(1:6))
p1
(dtc <- as(p1, "sparseMatrix")) # T-inverse in Mrode’s notation
solve(dtc)
inbreeding(p1) 

パッケージの混合モデルフィットはlme4に基づいています。これは、main関数の構文がlme4パッケージ関数のlmer関数に似ていることです。ただし、血統オブジェクトを配置できます。

pedigreemm(formula, data, family = NULL, REML = TRUE, pedigree = list(),
 control = list(),
start = NULL, verbose = FALSE, subset, weights, na.action, 
  offset, contrasts = NULL, model = TRUE, x = TRUE, ...)

これはあなたの質問への完全な答えではないことを知っていますが、これは少し役立つかもしれません。あなたがこの質問をしてくれてうれしいです、私にとって興味深いです!


1
RamSharmaの提案:親族関係を使用した解決策require(kinship); model1 <- lmekin(yld ~1, random = ~ 1|gen, varlist =list(covmat), data=mydata)
CHL

1
私の提案をさらに編集:model1 <- lmekin(yld ~1, random = ~ 1|gen, varlist =list(covmat), data=mydata)、まだ問題があります。投稿が早すぎて申し訳ありません。誰かがそれを修正できますか?
Ram Sharma

0

lmer()lme4パッケージ許可はランダム効果を渡りました。ここでは、次のようなものを使用します

y ~ (1|gen) + (1|repl)

詳細については、

http://www.stat.wisc.edu/~bates/PotsdamGLMM/LMMD.pdf


3
はい、交差ランダム効果のフィッティングは単独では問題ではありませんが、ユーザー定義の共分散構造のフィッティングが主な問題であり、質問は主にその答えを求めています。
ジョン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.