dummy.coef () для многомерных моделей - PullRequest
2 голосов
/ 19 октября 2011

Мне было интересно узнать о некоторых вещах в dummy.coef(), которые преобразуют оценочные параметры (контрасты) в моделях ANOVA в исходные.Он работает только для одномерных моделей, но изменения, необходимые для его работы и для многомерных моделей, кажутся незначительными.В dummy.coef.lm():

  • строка 52 coef <- object$coefficients должна быть coef <- as.matrix(object$coefficients) для размещения одномерных и многомерных моделей (coef(object) - вектор в 1-м случае и матрица во 2-м)
  • строка 60 ans <- drop(mm[rn == tl[j], keep, drop = FALSE] %*% coef[keep]) должна быть ans <- drop(mm[rn == tl[j], keep, drop = FALSE] %*% coef[keep, ]), чтобы все столбцы были в coef
  • строка 61 names(ans) <- rnn[rn == tl[j]] может быть names(ans) <- rep(rnn[rn == tl[j]], ncol(coef)), чтобы дать имена строкамвсе столбцы

Метод печати потребует некоторых изменений, но, похоже, это так. Кто-нибудь знает, почему dummy.coef() не был разработан для работы с многовариантными моделями?

Еще одна вещь, на которую я наткнулся: строки 20-22:

for (i in vars) args[[i]] <- if (nxl[[i]] == 1)
    rep.int(1, nl)
else factor(rep.int(xl[[i]][1L], nl), levels = xl[[i]])

Это безопасно??То есть, если предложение if() равно TRUE, не будет ли неожиданное else?Я бы ожидал что-то вроде

for (i in vars) args[[i]] <- if (nxl[[i]] == 1) {
    rep.int(1, nl)
} else { factor(rep.int(xl[[i]][1L], nl), levels = xl[[i]]) }

Ответы [ 2 ]

1 голос
/ 21 января 2016

У нас есть официальный отчет об ошибке dummy.coef с "своего рода" патчем, на который я сейчас смотрю - он выглядит неплохо, даже несмотря на то, что я изменил немного больше вещей, чем яожидая.

Когда я гуглил другие проблемы с dummy.coef, я получил этот старый SO поток.Позвольте мне ответить (как член основной группы R ), что мы заинтересованы в расширении многомерных моделей, если изменения кода (и документации) не велики.Пожалуйста, ответьте, если вы заинтересованы в помощи.

1 голос
/ 19 октября 2011

Это касается только вашего второго вопроса (тот, который касается оператора if() x else y в строках 20-22 в коде).

Для начала попробуйте вырезать и вставить эти два блока в Rсеанс:

test <- TRUE

# Block 1 -- Doesn't work
if(test) 
    cat("test is TRUE\n")
    else
    cat("test is FALSE\n")

# Block 2 -- Works
{
if(test) 
    cat("test is TRUE\n")
    else
    cat("test is FALSE\n")
}

Что происходит?{} все здесь меняет.Блок 1 «read-parse-оценивает» код построчно, вызывая только ту проблему, которую вы ожидаете.Блок 2, с другой стороны, читается и полностью анализируется до того, как произойдет любая оценка.Это часть того, что {} заставляет R делать.Когда он получает блок кода в целом, синтаксический анализатор четко анализирует блок if() x else y как одно выражение.

Код, который вы цитировали, был взят из тела функции (то есть из * 1014).* пара).В этом контексте он обрабатывается правильно (например, как Блок 2).

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...