我正在使用参数lm()
,formula
,data
和na.action
执行weights
。我的权重存储在数字变量中。
formula = "Response~0+."
)时,我会收到一个错误,即权重不是合适的长度(即使它是)。formula = Response~0+.
)时,该函数可以正常工作。 我在lm()
文档中偶然发现了这句话:
所有权重,子集和偏移的计算方式与公式中的变量相同,即数据中的第一个,然后是公式的环境。
这对我来说很难解释,但我觉得它包含了我的问题的答案。
答案 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
的对象,如果在那里找不到它,那么在附加到模型公式的环境中,如上所述,并不总是必须是全球环境。