Sparsematrix для отображения

Я пытаюсь использовать mapply, потому что я использовал forloop, но это занимает очень много времени, поэтому я пытаюсь использовать mapply для вычисления большого набора данных с разреженной матрицей в r, но я столкнулся с этой ошибкой

Error in (function (t)  : 
  unused arguments (dots[[2]][[1]], dots[[3]][[1]])

Это меньший набор данных

fam <- structure(list(ID = c(1L, 2L, 3L, 4L, 6L, 5L, 7L), dad = c(0L, 
                                                                  0L, 1L, 1L, 1L, 3L, 5L), mum = c(0L, 0L, 0L, 2L, 4L, 4L, 6L), 
                      GEN = c(1L, 1L, 2L, 2L, 3L, 3L, 4L)), class = "data.frame", row.names = c(NA, 
                                                                                                -7L))
library(Matrix)
hom = function(fam) {
  t1 <- min(which.max(fam$dad > 0), which.max(fam$mum > 0))
  t2 <- max(fam[["ID"]])
  A<-Matrix(0, nrow=t2,ncol=t2, sparse=TRUE)
  diag(A) <- 2-0.5^(fam[["GEN"]]-1)
 A<-mapply(t=t1:t2, function(t) A[[t,t]]<- sum(2-0.5^(fam[[t,"GEN"]]-  1)+0.5^(fam[t,"GEN"])*A[fam[t,"dad"],fam[t,"mum"]]),
    mapply(j=1:length(t-1), function(j)
      A[t,j]<-0.5*sum(c(A[j,fam[t,"dad"]],A[j,fam[t,"mum"]]))
    ), A <- as.numeric(tril(A)+t(tril(A, -1))))
return(A)
}

Что могло вызвать ошибку и как ее исправить?

Спасибо


person Victor    schedule 16.08.2019    source источник


Ответы (1)


Сигнатура функции для mapply:

mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)

В результате первый безымянный аргумент становится FUN (в вашем случае function(t)...). Ваш именованный аргумент t (t = t=t_start:t_end) передается этому. Все остальные безымянные аргументы также передаются FUN. В вашем коде mapply также передает

mapply(j=1:length(t-1), function(j) A[t,j]<-0.5*sum(c(A[j,fam[t,"dad"]],A[j,fam[t,"mum"]])))

а также

A <- as.numeric(tril(A)+t(tril(A, -1))

в качестве аргументов также для function(t), т.е. он передает три аргумента лямбда-функции, которая ожидает только 1 аргумент (t). В результате выдается ошибка. Это было бы похоже на вызов:

myTriple <- function(x) 3*x
myTriple(1, 2, 3)

Я не уверен, каковы ваши намерения в отношении других строк после первого вызова mapply, поэтому, чтобы исправить это, вам нужно либо function(t) принять (и использовать) дополнительные аргументы, переместить их в определение function(t) или переместить их из вызов. Вот ваш mapply вызов, отформатированный, чтобы было более очевидно, что происходит. Все аргументы mapply имеют одинаковый отступ:

  A <- mapply(t=t_start:t_end, 
            function(t) A[[t,t]]<- sum(2-0.5^(fam[[t,"GEN"]]-  1) + 0.5^(fam[t,"GEN"])*A[fam[t,"dad"],
                                       fam[t,"mum"]]
            ),
            mapply(j=1:length(t-1), 
                   function(j) A[t,j]<-0.5*sum(c(A[j,fam[t,"dad"]],A[j,fam[t,"mum"]]))), 
            A <- as.numeric(tril(A)+t(tril(A, -1)))
  )
person Marcus    schedule 16.08.2019
comment
спасибо, как я могу заставить function (t) использовать другие аргументы, имея в виду, что function (j) имеет вызов j=1:lenght(t-1)? - person Victor; 16.08.2019
comment
Тривиальный ответ - сделать это function(t, x, y), но я не думаю, что это решит то, что вы на самом деле пытаетесь сделать. Я не уверен, что mapply - это та функция, которую вы ищете. Возможно, вы это понимаете, но «m» означает несколько аргументов, которые вы передаете функции, а не матрицу. Я не совсем понимаю, что вы пытаетесь достичь, но то, как вы это сформулировали, кажется, что вы все еще определяете каждый элемент индивидуально, что не будет более эффективным, чем циклы for. Эффективность повысится, если вы сможете переформулировать его, чтобы векторизовать определение целых строк или столбцов. - person Marcus; 16.08.2019