#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