dummy.coef() для многомерных моделей

#r

#r

Вопрос:

Мне было интересно узнать о некоторых вещах, в 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]]) }
  

Ответ №1:

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

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

 test <- TRUE

# Block 1 -- Doesn't work
if(test) 
    cat("test is TRUEn")
    else
    cat("test is FALSEn")

# Block 2 -- Works
{
if(test) 
    cat("test is TRUEn")
    else
    cat("test is FALSEn")
}
  

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

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

HTH

Комментарии:

1. Я приму этот ответ, но мне все равно было бы очень любопытно получить ответ на мой первый вопрос…

2. Спасибо. Отвечая на ваш первый вопрос, я не могу придумать причину, по которой вам не следует этого делать, и, поскольку R имеет открытый исходный код, к счастью, вы легко можете это сделать. Возможно, вам также потребуется внести некоторые изменения print.dummy_coef , чтобы получить полную функциональность, но это тоже не должно быть слишком сложно.

Ответ №2:

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

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

Комментарии:

1. Спасибо, что взглянули на это! Мое предложение заключается в этой сути , быстрая проверка в этой сути . Обратите внимание, что это изменяет компоненты списка, возвращаемого, dummy.coef.lm() чтобы всегда быть матрицей. Кроме того, подход к печати объекта в многомерном случае может потребовать больше размышлений. Может ли / должно ли это быть расширено до dummy.coef.aovlist() ? Если это лучше подходит для вашего рабочего процесса, я могу открыть официальный отчет об ошибке с исправлением.

2. В предлагаемой версии dummy.coef.lm() единственными измененными строками являются 71, 78-80, в то время как предлагаемая версия print.dummy_coef() отличается от оригинала в большей степени.

3. Моя рабочая версия dummy.coef. Исходный файл R R уже сильно изменен по сравнению с онлайн-версией, поскольку я рассмотрел сообщение об ошибке, упомянутое (и связанное) выше. Поэтому я буду вручную «дифференцировать» и применять изменения так, как я их вижу. Спасибо вам также за пример.

4. Действительно, я думаю, что имеет смысл добавить официальное сообщение об ошибке (хотя и без исправления, см. Выше) или добавить к [существующему] [1] с комментарием. [1]: bugs.r-project.org/bugzilla/show_bug.cgi?id=16665

5. Спасибо, я открыл сообщение об ошибке здесь: bugs.r-project.org/bugzilla/show_bug.cgi?id=16688