R语言中波浪号~的含义及fm变量与[2:3]索引解析
我遇到如下代码:
fm <- y ~ x mods <- setNames(as.list(1:4), paste0("lm", 1:4)) # loop over the four datasets in the quartet for(i in 1:4) { fm[2:3] <- lapply(paste0(c("y","x"), i), as.name) mods[[i]] <- lmi <- lm(fm, data=anscombe) }我猜测此处~代表y与x间的线性关系,但想了解它的通用含义;同时想知道变量fm具体是什么,以及fm[2:3]中的索引[2:3]指代什么,恳请专业解答。
问题解答
1. ~ 的通用含义
在R语言中,~ 是公式(Formula)的核心运算符,核心作用是分隔模型的响应变量(因变量)和解释变量(自变量),用来定义变量间的关系结构,不止局限于线性关系:
- 基础用法:
响应变量 ~ 解释变量,比如代码里的y ~ x,表示y是因变量,x是自变量; - 常见拓展场景:
- 多变量模型:
y ~ x1 + x2,表示y由x1和x2共同解释; - 交互项:
y ~ x1*x2(等价于y ~ x1 + x2 + x1:x2),表示x1和x2的交互作用对y有影响; - 控制截距:默认模型带截距,
y ~ 0 + x表示强制去掉截距项; - 可视化映射:像
ggplot2这类可视化包也会用公式逻辑映射变量到图形属性,比如aes(x=x, y=y)本质就是基于公式的变量关联逻辑。
- 多变量模型:
2. 变量 fm 具体是什么
执行fm <- y ~ x后,fm是一个公式对象(Formula Object),你可以在R控制台输入class(fm)验证,返回结果是"formula"。
它是一种特殊的语言结构,存储了变量关系的语法信息。用str(fm)查看内部结构,会发现它是一个长度为3的语言对象:
- 第1个元素:运算符
~; - 第2个元素:公式左侧的因变量
y; - 第3个元素:公式右侧的自变量
x。
3. fm[2:3] 中的索引 [2:3] 指代什么
从公式对象的结构可知,fm的元素是按位置存储的:
fm[1]对应运算符~;fm[2]对应公式左侧的因变量(初始值为y);fm[3]对应公式右侧的自变量(初始值为x)。
所以fm[2:3]就是选取公式中的因变量和自变量部分。代码里通过lapply(paste0(c("y","x"), i), as.name)生成y1/x1、y2/x2这类动态变量名,赋值给fm[2:3],本质是动态替换公式里的因变量和自变量,从而循环拟合anscombe数据集中的4组(y1,x1)到(y4,x4)线性模型。
比如当i=1时,fm[2:3]会被替换为y1和x1,此时fm就变成y1 ~ x1,传入lm()函数就会拟合第一组数据的线性模型。
内容的提问来源于stack exchange,提问作者Nemo
相关产品推荐
相关产品推荐

