R verfügt über ein handliches Werkzeug zum Bearbeiten von Formeln, update.formula()
. Dies funktioniert gut, wenn Sie etwas wie "Formel, die alle Begriffe in der vorherigen Formel außer x
enthält", z.Entfernen von Versatzausdrücken aus einer Formel
f1 <- z ~ a + b + c
(f2 <- update.formula(f1, . ~ . - c))
## z ~ a + b
Allerdings scheint dies nicht mit Offset Bedingungen zu arbeiten:
f3 <- z ~ a + offset(b)
update(f3, . ~ . - offset(b))
## z ~ a + offset(b)
Ich habe so weit wie terms.formula
gegraben nach unten, die ?update.formula
Hinweise:
[nach Substitution , ...] Das Ergebnis wird dann vereinfacht über 'terms.formula (simplify = TRUE)'.
terms.formula(z ~ a + offset(b) - offset(b), simplify=TRUE)
## z ~ a + offset(b)
(dh dies scheint nicht offset(b)
zu entfernen ...)
Ich weiß, dass ich eine Lösung zerhacken entweder durch deparse()
und Textverarbeitung, oder durch die Formel Verarbeitung rekursiv, um den Begriff zu entfernen, den ich nicht möchte, aber diese Lösungen sind hässlich und/oder ärgerlich zu implementieren. Entweder Erleuchtung wie zu warum dies nicht funktioniert, oder eine einigermaßen kompakte Lösung, wäre toll ...
ein wenig mehr in den Code der Graben 'terms.formula' weist darauf hin, dass ** der Offsetterm explizit beibehalten wird **, obwohl dies offenbar noch nirgends dokumentiert ist ... –
Wenn man'? offset' sieht, steht in der Dokumentation: "Es kann mehr geben als ein Offset in einer Modellformel, aber - ist n ot wird für Offsetterme unterstützt (und entspricht +). "'. Könnte das der Grund dafür sein, dass deine offset() Begriffe nicht einfach sind? –
Nicht die glamouröseste, aber könnten Sie auch versuchen, stattdessen einen Offset (-b) hinzuzufügen? Ihre Formel sieht nicht vereinfacht aus, aber ich denke, der Effekt sollte derselbe sein. Wenn Sie versuchen, lm (mpg ~ cyl, data = mtcars); lm (mpg ~ cyl + offset (disp), data = mtcars); lm (mpg ~ cyl + offset (disp) + offset (-disp), data = mtcars); 'Sie sehen die 1. und 3.' lm() 's sind die gleichen. –