【问题标题】:Understanding lm and environment了解 lm 和环境
【发布时间】:2011-10-16 04:37:11
【问题描述】:

我正在执行 lm(),参数为 formuladatana.actionweights。我的体重存储在一个数字变量中。

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

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

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

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

【问题讨论】:

  • 是什么让您认为公式参数需要被引用?
  • 你能举一个可重现的例子吗?我很好奇问题是否出在 match.call() 中。
  • @Dirk 是正确的:为什么要引用公式?
  • 没有什么特别让我这么想的。显然它可以被引用,因为它在某些情况下有效。显然它不能被引用,因为它在某些情况下有效。我试图了解其中的区别。
  • 迭代器 - 为什么不呢?我不是要引用或不引用,我只是想了解其中的区别。我提供了 lm 文档中的一句话,我认为这是关键。与环境有关...我只是想不通

标签: r lm


【解决方案1】:

当您构造一个旨在作为公式的参数时,解析器会“尝试”。它“期望”参数是 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"

【讨论】:

  • 当我调用as.formula,即f <- as.formula(.); lm(f, ...)lm(as.formula(f),...) 时是否重要,尤其是关于将用于lm 的环境?
  • 不这么认为。试试看:dat <- data.frame(foo = 1:10, bar = runif(10)); environment(f <- as.formula(foo ~ bar); environment(formula(lm(f, data = dat))); environment(formula(lm(foo ~ bar, data = dat)))
  • 其实我觉得可以。我遇到过“就地”策略失败但 calc-first 策略成功的实例。我很惊讶,因为它似乎违反了功能范式。
  • @DWin 证据? ;-) 说真的 - 你能记得问题是在交互使用期间还是在编写函数和包装器时出现的?我完全可以相信,在将您自己的函数和包装器编写到使用公式的函数时会有所不同。在正常的交互式使用中,我认为事情会更简单。
  • @Gavin Simpson:我会尝试发布证据。我的记忆是,这发生在交互式会话中,但过去我的记忆多次被证明是错误的。我现在太忙了,甚至没有尝试构建一个可重现的示例
【解决方案2】:

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

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

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

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

【讨论】:

  • 加文,我想你已经回答了我所有的问题。 DWin 的答案是对公式类的一个很好的解释,但没有解释为什么字符公式有效。我怀疑字符公式被 lm 强制转换为公式对象。在这种情况下,公式的环境是 lm 框架,而不是父/调用框架。当 R 去寻找在数据对象中找不到的公式中引用的对象(您调用的过程)时,字符公式可能会发生故障。由于环境错误,这些对象肯定会丢失。
猜你喜欢
  • 2011-06-28
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2012-09-16
  • 1970-01-01
相关资源
最近更新 更多