我想知道dummy.coef()
中的一些事情,它们将ANOVA模型中的估计参数(对比度)转换为原始模型。它仅适用于单变量模型,但是使其适用于多变量模型所需的更改似乎很小。在dummy.coef.lm()
:
coef <- object$coefficients
必须coef <- as.matrix(object$coefficients)
才能容纳单变量和多变量模型(coef(object)
是第一种情况下的向量,第二种情况下是矩阵)ans <- drop(mm[rn == tl[j], keep, drop = FALSE] %*% coef[keep])
必须ans <- drop(mm[rn == tl[j], keep, drop = FALSE] %*% coef[keep, ])
才能将所有列保留在coef
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]]) }
答案 0 :(得分:1)
这只解决了你的第二个问题(关于代码中第20-22行if() x else y
语句的问题)。
首先,尝试将这两个块剪切并粘贴到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'读 - 解析 - 逐行评估'代码',导致你期望的问题。另一方面,块2被读取并在之前完全解析进行任何评估。这是{}
指示R做的事情的一部分。当它收到整个代码块时,解析器会清楚地将if() x else y
块解析为一个表达式。
您引用的代码是从函数体内部(即{}
对内部)获取的。在这种情况下,它被正确处理(即像第2组)。
HTH
答案 1 :(得分:1)
我们有official bug report about dummy.coef
的&#34;&#34;&#34;我现在正在寻找的补丁 - 看起来不错,即使同时改变了一些比我预期的更多的东西。
当我在谷歌搜索dummy.coef
的其他问题时,我得到了这个旧的SO线程。
如果代码(和文档)更改不大,让我回答(作为R core team的成员)我们 对多变量模型的扩展感兴趣。如果您有兴趣帮助,请回复。