dummy.coef()用于多变量模型

时间:2011-10-19 10:28:40

标签: r

我想知道dummy.coef()中的一些事情,它们将ANOVA模型中的估计参数(对比度)转换为原始模型。它仅适用于单变量模型,但是使其适用于多变量模型所需的更改似乎很小。在dummy.coef.lm()

  • 第52行coef <- object$coefficients必须coef <- as.matrix(object$coefficients)才能容纳单变量和多变量模型(coef(object)是第一种情况下的向量,第二种情况下是矩阵)
  • 第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 个答案:

答案 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的成员)我们 对多变量模型的扩展感兴趣。如果您有兴趣帮助,请回复。