Memperkirakan efek acak dan menerapkan struktur korelasi / kovariansi yang ditetapkan pengguna dengan paket R lme4 atau nlme

9

Saya memiliki tipe data berikut. Saya telah mengevaluasi 10 orang yang masing-masing diulang 10 kali. Saya memiliki 10x10 matriks relasi (hubungan antara semua kombinasi individu).

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

Gen ini adalah varietas tanaman yang berbeda, sehingga masing-masing dapat ditanam berulang kali dan hasilnya diukur. Matriks kovarians adalah ukuran keterkaitan dengan kesamaan genetik yang dihitung oleh probabilitas ibd dalam percobaan terpisah.

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

Model saya adalah:

yld = gen + repl + error 

baik gen dan repl dianggap acak dan saya ingin mendapatkan perkiraan efek acak yang terkait dengan masing-masing gen, namun saya perlu mempertimbangkan matriks hubungan.

Jika terlalu rumit untuk memuat model bersarang, saya hanya akan menghapus repl dari model, tetapi idealnya saya akan menyimpannya.

yld = gen +  error 

Bagaimana saya bisa mencapai ini menggunakan paket R, mungkin dengan nlme atau lme4? Saya tahu bahwa ASREML dapat melakukannya tetapi saya tidak memiliki pegangan dan saya suka R untuk menjadi kuat dan juga gratis.

Ram Sharma
sumber
1
Aaron, terima kasih atas pemikiran Anda, harapan akan mendapatkan saran yang lebih kuat tentang ini ...
Ram Sharma
Contohnya sangat membingungkan karena sangat menyarankan jenis dataset yang berbeda sama sekali; itu bertentangan dengan pertanyaan. Harap hapus contoh ini atau berikan yang realistis.
whuber
@whuber Saya mengedit beberapa kesalahan ketik saya dan memperjelas poin saya, semoga membantu
Ram Sharma
@RamSharma: Saya mengambil kebebasan untuk membuat sampel matriks kovarians positif yang pasti, dan membuat beberapa pengeditan kecil; merasa bebas untuk mengedit kembali jika saya telah mengubah sesuatu yang penting.
Aaron meninggalkan Stack Overflow
Saya pikir kita harus memigrasi ini ke stackoverflow, untuk mendapatkan lebih banyak tampilan. Saya tidak bagaimana melakukannya, dapatkah seseorang membantu?
John

Jawaban:

6

Coba kinshippaket yang didasarkan pada nlme. Lihat utas ini pada model r-sig-campuran untuk detail. Saya lupa tentang ini ketika saya mencoba melakukannya untuk model logistik. Lihat /programming/8245132 untuk contoh yang berhasil.

Untuk respons yang tidak normal, Anda perlu memodifikasi paket pedigreemm, yang didasarkan pada lme4. Itu membuat Anda dekat, tetapi matriks hubungan harus dibuat dari silsilah. Fungsi di bawah ini adalah modifikasi dari pedigreemmfungsi yang mengambil matriks hubungan acak.

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
}

Penggunaannya mirip dengan pedigreemmkecuali Anda memberikannya matriks hubungan sebagai relmatargumen, bukannya pedigree sebagai pedigreeargumen.

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

Ini tidak berlaku di sini karena Anda memiliki sepuluh pengamatan / individu, tetapi untuk satu pengamatan / individu Anda memerlukan satu baris lagi dalam fungsi ini dan patch kecil lme4untuk memungkinkan hanya satu pengamatan per efek acak.

Aaron meninggalkan Stack Overflow
sumber
Bagaimana dengan: lme (yld ~ 1, data = mydata, random = ~ gen + repl, korelasi = covmat) # rumusnya memberi dan kesalahan dan saya tidak yakin bahwa jika struktur korelasinya berlaku untuk replikasi atau residual, apa yang harus dilakukan? menurutmu ?
John
@ John: Efek acak yang dilewati sangat rumit nlmedan diperlukan sesuatu yang lebih rumit gen + repl; juga, saya pikir korelasi perlu memanggil salah satu nlmefungsi kovarians / korelasi dengan covmatsebagai parameter. Notasi untuk ini benar-benar rumit sehingga untuk mengatakan lebih banyak, saya membutuhkan Pinhiero / Bates, yang tidak saya lakukan hari ini.
Aaron meninggalkan Stack Overflow
maka jika tidak ada efek repl, menurut Anda lme ​​(yld ~ 1, data = mydata, random = ~ gen, korelasi = covmat) sesuai atau setara dengan kode asreml: asreml (yld ~ 1, random = ~ gen, ginverse = daftar (gen = inv.covmat), data = mydata), di mana inv.covmat adalah matriks lebur segitiga bawah (lihat dokumentasi asreml-r)
John
Notasi yang tepat mungkin akan menjadi sesuatu seperti lme(yld ~ 1, data = mydata, random = ~ 1 | gen, correlation = corSymm(value=covmatX, form= ~ gen, fixed=TRUE)), di mana covmatXadalah versi modifikasi covmatuntuk membuatnya corSymmmenginginkannya. Saya juga tidak yakin formistilahnya benar.
Aaron meninggalkan Stack Overflow
@ Harun, apakah patch ini berguna? Saya akan sering membutuhkannya untuk mencocokkan model dengan individu tunggal untuk setiap kelas ... Saya mungkin ingin bertanya sebagai pertanyaan yang terpisah .... mungkin terlalu banyak dalam pertanyaan ini
Ram Sharma
4

Jawaban ini adalah potensi perluasan saran yang dibuat oleh Aaron, yang telah menyarankan untuk menggunakan Pedigreem. Pedigreem dapat menghitung hubungan dari proyek sebagai sintaks berikut, saya tidak tahu bagaimana kita dapat menggunakan output relasi seperti itu dari cara yang berbeda.

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

Fit model campuran dari paket ini didasarkan pada lme4 untuk sintaks untuk fungsi utama mirip dengan lme4 fungsi paket fungsi lmer kecuali Anda dapat memasukkan objek silsilah di dalamnya.

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, ...)

Saya tahu ini bukan jawaban yang sempurna untuk pertanyaan Anda, namun ini bisa membantu sedikit. saya senang Anda mengajukan pertanyaan ini, menarik bagi saya!

John
sumber
1
Disarankan oleh RamSharma: Solusi menggunakan kekerabatan : require(kinship); model1 <- lmekin(yld ~1, random = ~ 1|gen, varlist =list(covmat), data=mydata).
chl
1
suntingan lebih lanjut untuk saran saya:, model1 <- lmekin(yld ~1, random = ~ 1|gen, varlist =list(covmat), data=mydata)masih ada masalah, maaf untuk posting prematur. Adakah yang bisa memperbaikinya?
Ram Sharma
0

lmer()dalam lme4paket tersebut memungkinkan efek acak menyeberang. Di sini, Anda akan menggunakan sesuatu seperti

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

Untuk referensi lengkap;

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

tamu
sumber
3
ya, pas efek acak silang tidak masalah sendiri namun pas struktur yang didefinisikan bersama pengguna adalah masalah utama dan pertanyaan utamanya mencari jawaban untuk itu.
John