如何解决如何在R的lm中将“权重”列名称作为变量传递?
下面的代码创建一个带有R lm的线性模型,然后创建一个带有权重列的加权模型。最后,我尝试使用变量weight_col
传递权重列名称,但失败。我很确定它正在df中查找“ weight_col”,然后在调用者的环境中找到长度为1的变量,并且长度不匹配。
如何使用weight_col作为df中权重列的名称?
我尝试了几种方法,但都没有成功。
> df <- data.frame(
x=c(1,2,3),y=c(4,5,7),w=c(1,3,5)
)
> lm(y ~ x,data=df)
Call:
lm(formula = y ~ x,data = df)
Coefficients:
(Intercept) x
2.333 1.500
> lm(y ~ x,data=df,weights=w)
Call:
lm(formula = y ~ x,data = df,weights = w)
Coefficients:
(Intercept) x
1.947 1.658
> weight_col <- 'w'
> lm(y ~ x,weights=weight_col)
Error in model.frame.default(formula = y ~ x,weights = weight_col,:
variable lengths differ (found for '(weights)')
> R.version.string
[1] "R version 3.6.3 (2020-02-29)"
解决方法
您可以通过提取器运算符使用数据框名称:
lm(y ~ x,data = df,weights = df[[weight_col]])
或者您可以使用函数get
:
lm(y ~ x,weights = get(weight_col))
,
我们可以使用[[
提取列的值
lm(y ~ x,data=df,weights=df[[weight_col]])
或与tidyverse
library(dplyr)
df %>%
summarise(model = list(y ~ x,weights = .data[[weight_col]]))
,
您的第一个示例if weights = w
在w
的上下文中使用非标准评估来找到df
。到目前为止,这对于交互使用是正常的。
您的第二组是weights = weight_col
,它解析为weights = "w"
,这是非常不同的。在R的非标准(或标准)评估中没有什么有意义的。
正如我在评论中所说,将标准评估表与[[
一起使用。
lm(y ~ x,weights=df[[weight_col]])
# Call:
# lm(formula = y ~ x,weights = df[[weight_col]])
# Coefficients:
# (Intercept) x
# 1.947 1.658
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。