模型公式中"."的含义与?formula文档不符?代码验证疑问
R公式中"."的解析逻辑误区
问题回顾
根据?formula文档:
公式中的"."有两种特殊解释。通常在模型拟合函数的data参数语境下,它表示‘公式中未明确列出的所有列’:详见terms.formula。仅在update.formula语境下,它表示‘该公式部分之前的内容’。
你预期公式y ~ x1 + . + (.)^2会生成仅含x2:x3交互项的模型矩阵,但实际结果包含了所有二阶交互项(x1:x2、x1:x3、x2:x3)。
你的测试代码:
dat <- data.frame( y = rnorm(10), x1 = runif(10), x2 = rbinom(10,size = 1,prob = 0.5), x3 = rbinom(10,size = 1,prob = 0.5) ) mt <- terms.formula( x = y ~ x1 + . + (.)^2, data = dat ) mm <- model.matrix(mt,dat) colnames(mm) # 输出: # [1] "(Intercept)" "x1" "x2" "x3" "x1:x2" # [6] "x1:x3" "x2:x3"
显式写公式得到预期结果:
mt1 <- terms.formula( x = y ~ x1 + x2 + x3 + (x2 + x3)^2, data = dat ) mm1 <- model.matrix(mt1,dat) colnames(mm1) # 输出: # [1] "(Intercept)" "x1" "x2" "x3" "x2:x3"
核心原因
你对"."的解析逻辑存在误解:
- 在普通公式(非
update.formula)语境下,每个"."都是独立解析的,不会继承其他"."的替换结果。 - 公式
y ~ x1 + . + (.)^2包含三个独立项:x1、.、(.)^2:- 第一个
.作为单独项,解析为数据中除响应变量y和已明确列出的x1之外的所有列,即x2+x3。 - 第二个
.位于子公式(.)^2中,该子公式未明确列出任何变量,因此.会解析为数据中除y之外的所有预测变量(x1+x2+x3)。平方后展开为所有主效应和二阶交互项。
- 第一个
- 最终公式经
terms.formula去重合并后,等价于y ~ (x1+x2+x3)^2,因此模型矩阵包含所有主效应与二阶交互项。
正确实现
若要得到仅含x2:x3的交互项,无需重复使用.,直接用以下公式即可:
mt_correct <- terms.formula( x = y ~ x1 + (.)^2, data = dat ) mm_correct <- model.matrix(mt_correct, dat) colnames(mm_correct) # 输出: # [1] "(Intercept)" "x1" "x2" "x3" "x2:x3"
这里的.在(.)^2中会解析为除y和x1之外的x2+x3,平方后展开为x2 + x3 + x2:x3,与x1合并后即为预期结果。
内容的提问来源于stack exchange,提问作者joran
相关产品推荐
相关产品推荐

