gpt4 book ai didi

regex - 从 R 中的模型公式中删除包装在函数中的变量

转载 作者:行者123 更新时间:2023-12-04 15:11:04 25 4
gpt4 key购买 nike

我有一个带有转换变量的模型,例如:

 data = data.frame(y = runif(100,0,10), x1 = runif(100,0,10), x2 =   runif(100, 0, 10))
mod = lm(y ~ scale(x1) + scale(x2), data)

我想从公式中删除一个完整的变量,如下所示:
mod = lm(y ~ scale(x1), # x2 is gone! 
data)

但是我想使用用户提供的要删除的变量的字符串来执行此操作(换句话说,我将其包装在一个函数中,并且手动编辑公式是不可行的,就像我在这里所做的那样)。

如果变量未转换,使用 gsub 会很简单:
remove.var = "x2"
update(mod, formula. = as.formula(gsub(remove.var, "", format(formula(mod)))))

但因此,它返回完全可预测的错误:
 > Error in as.matrix(x) : argument "x" is missing, with no default

因为 scale()还在公式中!

有没有办法用 regexpr 做到这一点? ,或者我没有看到的某种方式是完全明显的?我希望它可以扩展到其他类型的转换,例如: log , log10 ,等等。

作为另一层复杂性,假设要移除的变量也出现在交互中:
 mod = lm(y ~ scale(x1) * scale(x2), data)

在这种情况下,必须删除交互 *以及(错误 + s,我发现,没问题)。

任何帮助深表感谢。谢谢!

最佳答案

术语对象是具有附加属性的公式:

update(mod, formula=drop.terms(mod$terms, 2, keep.response=TRUE)  )

Call:
lm(formula = y ~ scale(x1), data = data)

Coefficients:
(Intercept) scale(x1)
5.0121 0.1236

如果您需要从字符串参数计算该位置,那么您可以 grep term.labels 属性:
> grep( "x2", attr( mod$terms, "term.labels") )
[1] 2

请注意,这也可以通过交互公式成功:
update(mod, formula=drop.terms(mod$terms, grep( "x2", attr( mod$terms, "term.labels") ), keep.response=TRUE) )
#----------

Call:
lm(formula = y ~ scale(x1), data = data)

Coefficients:
(Intercept) scale(x1)
5.0121 0.1236

关于regex - 从 R 中的模型公式中删除包装在函数中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26897745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com