Ước tính hiệu ứng ngẫu nhiên và áp dụng cấu trúc tương quan / hiệp phương sai do người dùng xác định với gói R lme4 hoặc nlme


9

Tôi có loại dữ liệu sau đây. Tôi đã đánh giá 10 cá nhân mỗi lần lặp lại 10 lần. Tôi có ma trận quan hệ 10x10 (mối quan hệ giữa tất cả các kết hợp của các cá nhân).

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 này là các giống cây khác nhau, vì vậy mỗi loại có thể được trồng lặp lại và năng suất được đo. Ma trận hiệp phương sai là thước đo liên quan bằng độ tương tự di truyền được tính bằng xác suất ibd trong các thí nghiệm riêng biệt.

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

Mô hình của tôi là:

yld = gen + repl + error 

cả gen và repl đều được coi là ngẫu nhiên và tôi muốn có được ước tính hiệu ứng ngẫu nhiên liên quan đến từng gen, tuy nhiên tôi cần xem xét ma trận mối quan hệ.

Nếu nó quá phức tạp để phù hợp với các mô hình lồng nhau, tôi sẽ chỉ loại bỏ thay thế khỏi mô hình, nhưng lý tưởng nhất là tôi sẽ giữ nó.

yld = gen +  error 

Làm thế nào tôi có thể đạt được điều này bằng cách sử dụng các gói R, có lẽ với nlme hoặc lme4? Tôi biết rằng ASREML có thể làm điều đó nhưng tôi không nắm giữ và tôi yêu R vì sự mạnh mẽ cũng như miễn phí.


1
Aaron, cảm ơn bạn đã suy nghĩ, hy vọng sẽ nhận được đề nghị mạnh mẽ hơn về điều này ...
Ram Sharma

Ví dụ này cực kỳ khó hiểu vì nó hoàn toàn gợi ý một loại dữ liệu khác nhau hoàn toàn; nó mâu thuẫn với câu hỏi Vui lòng xóa ví dụ này hoặc cung cấp một ví dụ thực tế.
whuber

@whuber Tôi đã chỉnh sửa một số lỗi đánh máy của mình và làm cho quan điểm của tôi rõ ràng hơn, hy vọng sẽ giúp
Ram Sharma

@RamSharma: Tôi đã lấy tự do để tạo một ma trận hiệp phương sai xác định dương, và thực hiện một vài chỉnh sửa nhỏ; vui lòng chỉnh sửa lại nếu tôi đã thay đổi điều gì đó quan trọng.
Aaron rời Stack Overflow

Tôi nghĩ rằng chúng ta nên di chuyển cái này sang stackoverflow, để có được nhiều lượt xem hơn. Tôi không làm thế nào để làm điều đó, ai đó có thể giúp đỡ?
John

Câu trả lời:


6

Hãy thử kinshipgói, dựa trên nlme. Xem chủ đề này trên các mô hình hỗn hợp r-sig để biết chi tiết. Tôi đã quên mất điều này khi tôi đang cố gắng thực hiện nó cho một mô hình logistic. Xem /programming/8245132 để biết ví dụ cụ thể.

Đối với các phản hồi không bình thường, bạn cần sửa đổi gói phả hệ, dựa trên lme4. Nó giúp bạn gần gũi, nhưng ma trận mối quan hệ phải được tạo ra từ phả hệ. Hàm dưới đây là một sửa đổi của pedigreemmhàm lấy ma trận quan hệ tùy ý thay thế.

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
}

Cách sử dụng tương tự như pedigreemmngoại trừ bạn cung cấp cho nó ma trận mối quan hệ làm relmatđối số thay vì phả hệ làm pedigreeđối số.

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

Điều này không áp dụng ở đây vì bạn có mười quan sát / cá nhân, nhưng đối với một quan sát / cá nhân, bạn cần thêm một dòng trong chức năng này và một bản vá nhỏ để lme4chỉ cho phép một quan sát cho mỗi hiệu ứng ngẫu nhiên.


Làm thế nào về: lme (yld ~ 1, data = mydata, Random = ~ gen + repl, tương quan = covmat) # công thức là cho và lỗi và tôi không chắc rằng nếu cấu trúc tương quan áp dụng cho sao chép hoặc thuật ngữ dư, thì làm gì bạn nghĩ ?
John

@ John: Hiệu ứng ngẫu nhiên chéo là khó khăn nlmevà cần một cái gì đó phức tạp hơn gen + repl; Ngoài ra, tôi nghĩ rằng mối tương quan cần phải gọi một trong nlmecác hàm hiệp phương sai / tương quan với covmattư cách là một tham số. Ký hiệu cho việc này thực sự rất khó khăn để nói thêm rằng tôi cần có Pinhiero / Bates trong tay, thứ mà tôi không có ngày hôm nay.
Aaron rời Stack Overflow

sau đó nếu không có hiệu ứng thay thế, bạn có nghĩ lme (yld ~ 1, data = mydata, Random = ~ gen, tương quan = covmat) là phù hợp hoặc tương đương với mã asreml: asreml (yld ~ 1, Random = ~ gen, ginverse = list (gen = inv.covmat), data = mydata), trong đó inv.covmat là ma trận nóng chảy tam giác thấp hơn (xem tài liệu asreml-r)
John

Ký hiệu đúng có lẽ sẽ là một cái gì đó giống như lme(yld ~ 1, data = mydata, random = ~ 1 | gen, correlation = corSymm(value=covmatX, form= ~ gen, fixed=TRUE)), covmatXphiên bản sửa đổi covmatđể làm cho nó tuy nhiên corSymmmuốn nó. Tôi cũng không chắc là formthuật ngữ này đúng.
Aaron rời Stack Overflow

@Aaron, làm gì có bản vá này tiện dụng? Tôi sẽ cần nó thường xuyên để phù hợp với một mô hình với từng cá nhân cho mỗi lớp ... Tôi có thể muốn hỏi như một câu hỏi riêng biệt .... nó có thể là quá nhiều trong câu hỏi này
Ram Sharma

4

Câu trả lời này là sự mở rộng tiềm năng của đề xuất được đưa ra bởi Aaron, người đã đề nghị sử dụng Pedigreem. Các phả hệ có thể tính toán mối quan hệ từ các dự án theo cú pháp sau đây, tôi không biết làm thế nào chúng ta có thể sử dụng đầu ra quan hệ như vậy từ các cách khác nhau.

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

Sự phù hợp mô hình hỗn hợp của gói dựa trên lme4 cho cú pháp của hàm chính tương tự như hàm lmer của hàm lme4 ngoại trừ bạn có thể đặt đối tượng phả hệ vào nó.

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

Tôi biết đây không phải là câu trả lời hoàn hảo cho câu hỏi của bạn, tuy nhiên điều này có thể giúp ích một chút. tôi rất vui vì bạn đã hỏi câu hỏi này, thú vị với tôi!


1
Được đề xuất bởi RamSharma: Giải pháp sử dụng họ hàng : require(kinship); model1 <- lmekin(yld ~1, random = ~ 1|gen, varlist =list(covmat), data=mydata).
chl

1
chỉnh sửa thêm cho đề xuất của tôi: model1 <- lmekin(yld ~1, random = ~ 1|gen, varlist =list(covmat), data=mydata)vẫn còn một vấn đề, xin lỗi vì đăng sớm. Ai đó có thể sửa nó không?
Ram Sharma

0

lmer()trong lme4gói cho phép vượt qua hiệu ứng ngẫu nhiên. Ở đây, bạn sẽ sử dụng một cái gì đó như

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

Để tham khảo đầy đủ;

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


3
có, hiệu ứng ngẫu nhiên chéo phù hợp không phải là vấn đề đơn thuần tuy nhiên cấu trúc đồng phương do người dùng xác định là vấn đề chính và câu hỏi chủ yếu tìm kiếm câu trả lời cho điều đó.
John
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.