我试图从 lm()
函数返回的模型对象中获取输入变量名称。我尝试访问 lm_obj$terms
下的属性“变量”。但是,返回的对象是“语言”类型对象,而不是常规名称向量。
例如:
lm_obj = lm(y ~ x + z + z:x, data=df)
attr(lm_obj$terms, 'variables')
# list(x, z)
什么是“语言”类型?如何将此“语言”类型对象转换为 c('x', 'z')
等常规向量?
最佳答案
您走在正确的道路上。 “terms”
对象是您应该查看的位置。如果您想省略响应变量,可以使用delete.response
。
all.vars(delete.response(terms(lm_obj)))
#[1] "x" "z"
我还想向您指出
labels(terms(lm_obj))
#[1] "x" "z" "x:z"
这有时更有用。
一个可重现的示例来补充您的问题
df <- data.frame(y = rnorm(20), x = rnorm(20), z = rnorm(20))
lm_obj <- lm(y ~ x + z + z:x, data = df)
要了解为什么我们应该比其他地方更关注“术语”,您可以在此处针对以下模型尝试不同的答案:
## thanks to user "WhatIf" for proposing `model = FALSE`
lmfit <- lm(y ~ poly(x) + z + I(z ^ 2) + z:x, data = df,
na.action = na.exclude, model = FALSE)
rm(df) ## do not omit this line! run it before trying other answers
其他回复
(1) why does the 'variables' attribute store the 'language' object that spells out a list rather than a regular "list" object?
因为“项”是在模型拟合的早期阶段创建的:公式解析。实际变量评估稍后发生。
(2) how to convert a 'language' object to a regular "list" or "vector".
我们进行评估,可以在其中找到引用的变量:
eval(attr(terms(lm_obj), 'variables'), df)
关于r - 从 "lm"和 "glm"对象中获取输入变量名称的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72999859/