定义在公式中使用的中缀运算符

Mic*_*ico 12 r formula infix-operator

我正在尝试创建解决方案的更简约版本,这需要在表单中指定公式的RHS d1 + d1:d2.

鉴于*在公式的上下文是一个精辟的替身充分互动(即d1 * d2给出了d1 + d2 + d1:d2),我的方法是尝试和定义代替负责人,说%+:%使用中缀方法,我已经习惯于在其他应用中,一拉:

"%+:%" <- function(d1,d2) d1 + d2 + d1:d2
Run Code Online (Sandbox Code Playgroud)

然而,这可以预见失败,因为我没有注意评估; 让我们举一个例子来说明我的进展:

set.seed(1029)
v1 <- runif(1000)
v2 <- runif(1000)
y <- .8*(v1 < .3) + .2 * (v2 > .25 & v2 < .8) - 
  .4 * (v2 > .8) + .1 * (v1 > .3 & v2 > .8)
Run Code Online (Sandbox Code Playgroud)

通过这个例子,希望很清楚为什么简单地写出这两个术语可能是不可取的:

y ~ cut(v2, breaks = c(0, .25, .8, 1)) +
  cut(v2, breaks = c(0, .25, .8, 1)):I(v1 < .3)
Run Code Online (Sandbox Code Playgroud)

接近我想要的输出的一个解决方法是将整个公式定义为函数:

plus.times <- function(outvar, d1, d2){
  as.formula(paste0(quote(outvar), "~", quote(d1),
                    "+", quote(d1), ":", quote(d2)))
}
Run Code Online (Sandbox Code Playgroud)

这给出了传递给的预期系数lm,但是名称更难直接解释(特别是在我们注意给出的实际数据d1d2描述性名称中,与此通用示例相反):

out1 <- lm(y ~ cut(v2, breaks = c(0, .25, .8, 1)) +
             cut(v2, breaks = c(0, .25, .8, 1)):I(v1 < .3))
out2 <- lm(plus.times(y, cut(v2, breaks = c(0, .25, .8, 1)), I(v1 < .3)))
any(out1$coefficients != out2$coefficients)
# [1] FALSE
names(out2$coefficients)
# [1] "(Intercept)"         "d1(0.25,0.8]"        "d1(0.8,1]"           "d1(0,0.25]:d2TRUE"  
# [5] "d1(0.25,0.8]:d2TRUE" "d1(0.8,1]:d2TRUE"
Run Code Online (Sandbox Code Playgroud)

所以这不是最佳的.

有没有办法定义调整代码,以便我上面提到的中缀运算符按预期工作?如何改变形式,plus.times以便不重命名变量?

我一直在关注着(?formula,?"~",?":",getAnywhere(formula.default),这个答案等),但还没有看到[R究竟是如何解释*,当它在公式中遇到的真实,这样我可以让我的希望的小的调整.

Hea*_*ner 6

在这种情况下,您不需要定义新的运算符:在公式中d1/d2扩展为d1 + d1:d2.换句话说,d1/d2指定d2嵌套在其中d1.继续你的例子:

out3 <- lm(y ~ cut(v2,breaks=c(0,.25,.8,1))/I(v1 < .3))
all.equal(coef(out1), coef(out3))
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

进一步评论

因素可以交叉嵌套.如果可以观察到两个因素的各种水平,例如性别和治疗,温度和pH等,则可以交叉两个因素.如果该因子的每个级别只能在其中一个级别内观察,则该因子嵌套在另一个因子中另一个因素,例如城镇和国家,工作人员和商店等.

这些关系反映在模型的参数化中.对于我们使用的交叉因子,d1*d2或者d1 + d2 + d1:d2,为了给出每个因子的主要影响,加上相互作用.对于嵌套因子,我们使用d1/d2或为每个级别d1 + d1:d2的表单提供单独的子模型.1 + d2d1

嵌套的想法不仅限于因素,例如我们可以使用sex/x适合x男性和女性的单独线性回归.

在公式中,%in%等同于:,但它可以用于强调数据/模型的嵌套或分层结构.例如,与之a + b %in% a相同a + a:b,但将其读作"a中的加号b"可以更好地描述拟合的模型.即便如此,使用时还/具有在强调结构的同时简化模型公式的优点.