更新公式 - 如何“取消”函数:log(y) - > ÿ?

时间:2011-10-17 01:13:13

标签: r

我不想使用算术逆,因为可能会丢失某些东西。例如,如果存在负值,则log将给出NA s。有“公式逆”吗?我查看了?formula?update.formula?terms.formula。我认为terms.formula可能有一些可以帮助我的东西,但我不这么认为。

在下文中,我想要一个cancel函数,就像在temp2中一样。我希望它给出与temp3相同的结果。

temp1 <- log(y) ~ x
temp2 <- update(temp1, cancel(.) ~ .)
temp3 <- update(temp1, y ~ .)

我不仅对log感兴趣。这是另一个例子:

foo1 <- factor(y) ~ x
foo2 <- update(foo1, y ~ .) #I would like this same result, but without having to use "y"

我想要一些简单的事情。我尝试过像

这样的东西
temp1[2] <- gsub("log","",temp1[2])

我无法让它发挥作用。但我不知道无论如何我都想要这个。

有什么想法吗?

[编辑:更多背景] 出于可读性目的,我对此非常感兴趣。我喜欢update.formula函数,因为我认为它使代码真正可读。 update.formula直接显示,而不是必须比较两个公式来找出差异。因此,我有一个我正在使用的模型,其因变量为factor(y)。我想将该公式更新为y。我可以明确地执行此操作,但就像您可以使用yfactor(y)转到factor(.)一样,我想告诉读者我正在更新公式,像take_off_factor(.)。例如,如果我在开头定义我的模型,然后在代码的中间我有new_model <- update(original_model, y ~ .),你必须返回并找到原始模型以找出我之前的因变量。可能是log(y)factor(y)。通过做take_off_factor(.)〜之类的事情。你知道旧模型有factor(y)。当然,我可以添加评论来解释我在做什么。我会这样做,但我也认为好的代码应该说明一切。

2 个答案:

答案 0 :(得分:1)

这很困难,因为如果函数不是bijective,那么反转它可能意味着获得多个值(即多个可能的输入可能导致相同的可能输出)。在这些情况下,您可能必须以数字方式解决这些问题,这通常需要很长时间。

您可以定义允许日志取负值的类或函数(记住输入和输入的绝对值);然后这可以倒置。实际上,你没有直接使用复杂的数字。

另一个选择是存储输入和输出的输入和输出对;然后你可以简单地在对中查找正确的输入。

答案 1 :(得分:1)

您可以使用双方括号子集([[)来提取公式及其组成调用的组件,例如

temp1[[2]]
log(y)
temp1[[2]][[2]]
y

因此对于这个例子(删除最外面的函数)使用它两次就足够了。要将它们组合在一起,您需要使用粘贴来评估,然后转换回公式:

temp2 <- update(temp1,formula(paste(temp1[[2]][[2]],"~.")))
temp2
y ~ x

或者,您可以直接更改公式:

temp3 <- temp1
temp3[[2]] <- temp1[[2]][[2]]
temp3
y~x