Зацикливание всех парных сравнений из списка в R - PullRequest
0 голосов
/ 06 февраля 2019

В моем коде R ниже, предположим, что я хочу сравнить все уникальные объекты 2 m, используя аналогичную процедуру R.Например, для сравнения m1 и m2 моя процедура такова:

pchisq(2 * (logLik(m2) - logLik(m1)), df = abs(m1$df.residual - m2$df.residual), lower = F)

Вопрос:

Мне было интересно, какЯ мог бы создать функцию для всех уникальных парных сравнений для всех m объектов, используя мою подпрограмму?

Вот что я пытался без успеха:

## Suppose we have 4 `m` objects: `m1...m4` (6 unique pairwise comparisons possible)

m1 <- lm(hp ~ vs, mtcars)
m2 <- lm(hp ~ vs*wt, mtcars)
m3 <- lm(hp ~., mtcars)
m4 <- lm(hp ~ vs * gear * wt, mtcars)


 compare <- function(...){

   m <- list(...)
   L <- length(m) - 1

   lapply(1:L, function(i) pchisq(2 * (logLik(m[[i+1]]) - logLik(m[[i]])), df = abs(m[[i]]$df.residual - m[[i+1]]$df.residual), lower.tail = FALSE) )

  }
# Example of use:
compare(m1, m2, m3, m4)

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете использовать combn, чтобы получить все комбинации, которые хотите сравнить:

compare <- function(...){

  m <- list(...)
  n_mod <- length(m)
  names(m) <- sapply(substitute(list(...))[-1], deparse)
  combs <- t(combn(x = names(m), m = 2))

  comp_value <- apply(X = combs, MARGIN = 1, function(ind) pchisq(2 * (logLik(m[[ind[2]]]) - logLik(m[[ind[1]]])), df = abs(m[[ind[1]]]$df.residual - m[[ind[2]]]$df.residual), lower.tail = FALSE))
  df_out <- data.frame(combs, comp_value)
  names(df_out) <- c("mod_1", "mod_2", "comp_value")

  return(df_out)
}

Таким образом, чтобы упростить чтение результата, вы можете вернуть data.frame со всеми сравнениями.

Тогда

compare(m1, m2, m3, m4)
  mod_1 mod_2   comp_value
1    m1    m2 2.391012e-02
2    m1    m3 7.253068e-08
3    m1    m4 1.248692e-06
4    m2    m3 2.735901e-07
5    m2    m4 4.256098e-06
6    m3    m4 1.000000e+00
...