gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:09:10 28 4
gpt4 key购买 nike

我正在尝试创建一个更简洁的版本 this解决方案,需要以 d1 + d1:d2 形式指定公式的 RHS .

鉴于 *在公式的上下文中是完全交互的简洁替代品(即 d1 * d2 给出 d1 + d2 + d1:d2 ),我的方法是尝试定义一个替代运算符,例如 %+:%使用我在其他应用程序中已经习惯的中缀方法,例如:

"%+:%" <- function(d1,d2) d1 + d2 + d1:d2

然而,这可以预见失败,因为我没有仔细评估;让我们举一个例子来说明我的进步:
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)

通过这个例子,希望能清楚为什么简单地写出这两个术语可能是不可取的:
y ~ cut(v2, breaks = c(0, .25, .8, 1)) +
cut(v2, breaks = c(0, .25, .8, 1)):I(v1 < .3)

接近我想要的输出的一种解决方法是将整个公式定义为一个函数:
plus.times <- function(outvar, d1, d2){
as.formula(paste0(quote(outvar), "~", quote(d1),
"+", quote(d1), ":", quote(d2)))
}

这给出了传递给 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"

所以这不是最优的。

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

我一直在四处闲逛( ?formula?"~"?":"getAnywhere(formula.default)this 答案等)但还没有看到 R 是如何解释 *当它在公式中遇到时,以便我可以进行所需的细微调整。

最佳答案

在这种情况下,您不需要定义新的运算符:在公式 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

进一步评论

因素可以交叉或嵌套。如果可以观察两个因素的每个水平组合,则将两个因素交叉,例如性别和处理、温度和 pH 值等。如果该因素的每个水平只能在另一个因素的一个水平内观察到,则该因素嵌套在另一个因素中,例如城镇和乡村,工作人员和商店等。

这些关系反射(reflect)在模型的参数化中。对于交叉因子,我们使用 d1*d2d1 + d2 + d1:d2 , 给出每个因素的主效应,加上交互作用。对于嵌套因子,我们使用 d1/d2d1 + d1:d2给出形式 1 + d2 的单独子模型对于每个级别 d1 .

嵌套的思想不限于因子,例如我们可以使用 sex/xx 上拟合单独的线性回归对于男性和女性。

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

关于r - 定义在公式中使用的中缀运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32616762/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com