我不想使用算术逆,因为可能会丢失某些东西。例如,如果存在负值,则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
。我可以明确地执行此操作,但就像您可以使用y
从factor(y)
转到factor(.)
一样,我想告诉读者我正在更新公式,像take_off_factor(.)
。例如,如果我在开头定义我的模型,然后在代码的中间我有new_model <- update(original_model, y ~ .)
,你必须返回并找到原始模型以找出我之前的因变量。可能是log(y)
或factor(y)
。通过做take_off_factor(.)
〜之类的事情。你知道旧模型有factor(y)
。当然,我可以添加评论来解释我在做什么。我会这样做,但我也认为好的代码应该说明一切。
答案 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