我看到过在公式中使用 ~ 运算符的方法。例如,y~x
的意思是:y 以 x 为分布。
但是,我真的很困惑这段代码中的 ~0+a
是什么意思:
require(limma)
a = factor(1:3)
model.matrix(~0+a)
仅仅使用model.matrix(a)
为什么不起作用?model.matrix(~a)
的结果为什么与model.matrix(~0+a)
的结果不同?最后,这里的~运算符是什么意思?
我看到过在公式中使用 ~ 运算符的方法。例如,y~x
的意思是:y 以 x 为分布。
但是,我真的很困惑这段代码中的 ~0+a
是什么意思:
require(limma)
a = factor(1:3)
model.matrix(~0+a)
仅仅使用model.matrix(a)
为什么不起作用?model.matrix(~a)
的结果为什么与model.matrix(~0+a)
的结果不同?最后,这里的~运算符是什么意思?
~
用于创建公式,它将公式的左侧和右侧分隔开。
来自?`~`
波浪线用于在模型公式中分隔左侧和右侧。
引用自公式的帮助文档
例如由lm和glm函数拟合的模型以紧凑的符号形式指定。 ~操作符是组成这种模型的基础。形式为y〜model的表达式被解释为规范响应y由线性预测器模型符号指定的模型。这样的模型由一系列术语组成,这些术语由+运算符分隔。这些术语本身由变量和因子名称由:运算符分隔。这样一个术语被解释为该术语中出现的所有变量和因子的交互作用。
除了+和:之外,还有许多其他运算符在模型公式中很有用。*运算符表示因子交叉:a*b解释为a+b+a:b。^运算符指示交叉到指定的程度。例如(a+b+c)^2与(a+b+c)*(a+b+c)相同,其展开为包含变量a、b和c的主效应及其二阶交互作用的公式。%in%运算符表示其左侧的术语嵌套在右侧的术语中。例如a+b%in%a扩展为a+a:b的公式。-运算符删除指定的术语,因此(a+b+c)^2-a:b等同于a+b+c+b:c+a:c。它还可用于删除截距项:当拟合线性模型y〜x-1时,指定通过原点的直线。没有截距的模型也可以指定为y~x+0或y~0+x。
~a+0
的具体问题a
是一个因子变量,所以model.matrix(〜a)
将返回一个包含截距列的矩阵,其中a1
是截距列 ( 你需要 n-1
个指标来完全确定n
类)每个函数的帮助文件都写得很好、详细并易于查找!
model.matrix(a)
无法正常工作model.matrix(a)
无法正常工作,因为a
是一个factor
变量,而不是一个公式或术语对象。
从model.matrix
的帮助文档中可以看到:
object an object of an appropriate class. For the default method, a model formula or a terms object.
R
正在寻找特定类别的对象,通过传递公式~a
,您正在传递一个属于类别为formula
的对象。 model.matrix(terms(~a))
也可以工作(传递与公式~a
相对应的术语对象)
@BenBolker在他的评论中提到,这是Wilkinson-Rogers符号的修改版本。
R介绍中有一个很好的描述。
?"~"
。
R
的问题,而是关于线性模型和公式符号的更一般性的问题。 - mnel