了解lm和环境

时间:2011-07-29 18:38:03

标签: r lm

我正在使用参数lm()formuladatana.action执行weights。我的权重存储在数字变量中。

  • 当我将公式指定为字符(即formula = "Response~0+.")时,我会收到一个错误,即权重不是合适的长度(即使它是)。
  • 当我指定不带引号的公式(即formula = Response~0+.)时,该函数可以正常工作。

我在lm()文档中偶然发现了这句话:

  

所有权重,子集和偏移的计算方式与公式中的变量相同,即数据中的第一个,然后是公式的环境。

这对我来说很难解释,但我觉得它包含了我的问题的答案。

2 个答案:

答案 0 :(得分:7)

当您构造一个旨在成为公式的参数时,解析器会“尝试它”。它“期望”该论证是R语言中的语言调用。它不希望它是由引号分隔的字符串。这就是为什么你会看到人们使用paste(。)构造公式参数,然后通过将字符串或更正确的“character object”作为参数放到as.formula()来完成它们。返回的内容被赋予了一类“公式”和“呼叫”模式:

> class( as.formula("Y ~ x") )
[1] "formula"
> mode( as.formula("Y ~ x") )
[1] "call"s
> class( "Y ~ x")
[1] "character"
> mode( "Y ~ x")
[1] "character"

答案 1 :(得分:6)

(这与你遇到的真正问题无关,[@DWin已经解决了这个问题,正如你的Q评论员所说的那样],但是通过对你引用的文档部分的解释来说明了这一点。

引用的帮助信息意味着使用相同的过程在模型公式中查找变量/对象引用,用于查找提供给参数权重,子集等的变量/对象。

R查找公式中引用的对象以及参数权重,子集和偏移量,首先在数据对象中,然后在公式的环境中(通常是交互式使用期间的全局环境)。

文档明确提到这一点的原因是因为lm()与使用模型公式接口的许多R函数一样,使用所谓的标准非标准评估。最重要的是,一个提供weights = foo,R在评估参数时不一定会寻找对象foo。相反,它会在提供给foo参数的对象中查找名称为data的对象,如果在那里找不到它,那么在附加到模型公式的环境中,如上所述,并不总是必须是全球环境。