Обновление формулы - как мне «отменить» функцию: log (y) -> y? - PullRequest
2 голосов
/ 17 октября 2011

Я не хочу использовать обратную арифметику, потому что что-то может быть потеряно. Например, если есть отрицательные значения, log выдаст NA с. Есть ли «обратная формула»? Я посмотрел на ?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). Конечно, я мог бы просто добавить комментарии, чтобы объяснить, что я делаю. Я сделаю это, но я также думаю, что хороший код должен говорить сам за себя.

Ответы [ 2 ]

1 голос
/ 17 октября 2011

Вы можете использовать двойные квадратные скобки ([[) для извлечения компонентов формулы и входящих в нее вызовов, например,

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

Поэтому для этого примера (без удаления самой внешней функции) достаточно дважды ее использовать. Чтобы объединить это вместе, вам нужно использовать paste для оценки, а затем преобразовать обратно в формулу:

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

Или вы можете изменить формулу напрямую:

temp3 <- temp1
temp3[[2]] <- temp1[[2]][[2]]
temp3
y~x
1 голос
/ 17 октября 2011

Это сложно, потому что если функция не является биективной , то ее инвертирование может означать получение нескольких значений (то есть несколько возможных входов могут привести к одному и тому же возможному выходу).В этих случаях вам, возможно, придется решать числовые решения, что часто занимает много времени.

Вы можете определить класс или функцию, которая позволяет журналу принимать отрицательные значения (запоминание входных данных и абсолютных значений).ценность ввода);тогда это можно перевернуть.По сути, вы будете использовать комплексные числа, не делая этого напрямую.

Другой вариант - хранить пары входов и выходов, поступающих в и из функции;тогда вы можете просто найти правильный вход в паре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...