有没有比?formula?更好的R公式参考资料?

26

在R中,有很多冗余且有时相互冲突的指定公式的方式。是否有一个全面而简洁的参考资料来将概念模型映射到R语法,而不是使用?formula?

我对广泛概述感兴趣,包括用于指定非线性和分层模型的语法,例如glmlmergamearth,包括嵌套的(/)、混合模型中的随机和固定效应,以及流行贡献软件包中发现的其他内容,例如ste用于样条。

1个回答

25
R附带了几个手册,可以从运行R时顶部右侧的“帮助”菜单中访问,也可以在线上的多个位置找到。例如,《R简介》的第11章有几页关于公式的内容。虽然我不确定它是否构成了一个“全面”的资源,但它涵盖了大部分你需要知道的关于公式如何工作的内容。公式在S语言中的规范参考可能是 Chambers J.M.和Hastie T.J.(1992)编写的《S中的统计模型》。Chapman & Hall出版社,伦敦。尽管这种方法的起源来自 Wilkinson G.N.和Rogers C.E.(1973)的研究,“用于方差分析的阶乘模型的符号描述。” 应用统计学,22,392-399。与R相关的一些最近的书籍讨论了公式,但我不确定是否可以称之为全面。此外,还有许多在线资源(例如这里),通常包含非常有用的信息。话虽如此,一旦您熟悉使用R中的公式,并且可以将更多的知识放置在其中,帮助页面就包含了大量的信息(以及它链接到的其他页面)。它有点简洁和神秘,但是一旦您拥有R特定工作方式的更广泛基础知识,它就可以非常有用。关于R公式的具体问题(取决于其内容),可能会在StackOverflow或CrossValidated上讨论。确实已经有一些与公式相关的相当高级的问题(使用类似[r] formula的搜索可能会很有成果),并且有更多这样的问题将有助于帮助那些遇到这些问题的用户;如果您有具体问题,我鼓励您提出。至于“冗余”和“冲突”,我想您指的是例如有多种指定无截距模型的方法:y ~ . -1y ~ . +0都可以使用,但在稍微不同的上下文中每种方法都有意义。此外,还有一个常见的问题,即必须从公式接口中隔离二次和高阶项(使用I(x^2)作为预测器,使其通过公式接口而不受损伤,并在足够远的地方幸存下来以被解释为代数表达式)。同样,一旦你了解了“幕后”发生了什么,这似乎就不那么麻烦了。以下是我刚才提到的事情的具体例子:
lm(dist ~ . -1, data=cars) # "remove-intercept-term" form of no-intercept
lm(dist ~ . +0, data=cars) # "make-intercept-zero" form of no-intercept
lm(dist ~ speed + speed^2, data=cars) # doesn't do what we want here
lm(dist ~ speed + I(speed^2), data=cars) # gets us a quadratic term
lm(dist ~ poly(speed,2), data=cars) # avoid potential multicollinearity

我认为公式接口至少需要在?formula帮助文档中提供更多指导和更好的示例。


非常感谢您提供的有用答案。我对更广泛的概述很感兴趣,包括嵌套变量和固定效应与随机效应的规范。此外,“x + I(x^2)”和“poly(x, 2)”不是等价的吗?您的答案表明不是这样。其他感兴趣的方面包括在函数(例如gam)中指定样条函数(例如ste)。 - Abe
关于倒数第二段(有关bugbear)中,使用I不仅限于指定多项式项 - 还需要指定其他变量转换(包括加法、乘法、对数、指数)。 - Abe
这对于加法和乘法是正确的,因为它们对公式接口有意义。但是lm(dist~log(speed),data=cars)按预期工作。 - Glen_b
“你的回答表明了不同的意见。” - 嗯,(i)我真的不认为它有所不同,因为-注释确切地解释了为什么那个系数存在,并且该注释并不涉及不同的模型,(ii)它们不是相同的系数(因为poly使用(1,x,x ^ 2)的正交变换),并且当多重共线性是一个严重的问题时,甚至不一定是完全相同的拟合。如果您愿意,我可以删除那行,但我认为当人们考虑拟合多项式时,他们应该考虑使用它,所以既然我提到了多项式,我觉得指向poly很重要。 - Glen_b
2
人们应该严厉警告不要使用 X+I(X^2),而应该提供 poly(X,2)。如果不这样做,就会剥夺他们进入多项式推断的安全统计通道。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接