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,但是名称更难直接解释(特别是在我们注意给出的实际数据d1和d2描述性名称中,与此通用示例相反):
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究竟是如何解释*,当它在公式中遇到的真实,这样我可以让我的希望的小的调整.
在这种情况下,您不需要定义新的运算符:在公式中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"可以更好地描述拟合的模型.即便如此,使用时还/具有在强调结构的同时简化模型公式的优点.
| 归档时间: |
|
| 查看次数: |
229 次 |
| 最近记录: |