6

我正在执行lm()参数formula, data,na.actionweights. 我的权重存储在一个数字变量中。

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

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

所有的权重、子集和偏移量都以与公式中的变量相同的方式进行评估,即首先在数据中,然后在公式的环境中。

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

4

2 回答 2

7

当您构造一个旨在成为公式的参数时,解析器会“尝试”。它“期望”参数是 R 意义上的语言调用。它不希望它是由引号分隔的字符串。这就是为什么你会看到人们使用 paste(.) 构造公式参数,然后通过将字符串或更正确的“字符对象”作为 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"
于 2011-07-29T20:06:35.597 回答
6

(这与您遇到的真正问题无关,[@DWin 已经解决了这个问题,就像您的 Q 上的评论员一样],但这是对您引用的文档部分的解释)

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

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

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

于 2011-07-29T20:46:06.937 回答