Das ist eigentlich eine ziemlich interessante Beobachtung. Tatsächlich fällt unter allen 6 Plots, die von plot.lm
unterstützt werden, nur der Q-Q-Plot in diesem Fall aus. Betrachten Sie das folgende reproduzierbare Beispiel:
x <- runif(20)
y <- runif(20)
fit <- lm(I(y^(1/3)) ~ I(x^(1/3)))
## only `which = 2L` (QQ plot) fails; `which = 1, 3, 4, 5, 6` all work
stats:::plot.lm(fit, which = 2L)
Innen plot.lm
wird der Q-Q Plot einfach wie folgt hergestellt:
rs <- rstandard(fit) ## standardised residuals
qqnorm(rs) ## fine
## inside `qqline(rs)`
yy <- quantile(rs, c(0.25, 0.75))
xx <- qnorm(c(0.25, 0.75))
slope <- diff(yy)/diff(xx)
int <- yy[1L] - slope * xx[1L]
abline(int, slope) ## this fails!!!
Error: $ operator is invalid for atomic vectors
Das ist also ein reines Problem der abline
Funktion! Hinweis:
is.object(int)
# [1] TRUE
is.object(slope)
# [1] TRUE
das heißt, beide int
und slope
hat Klassenattribut (lesen ?is.object
, es ist eine sehr effiziente Art und Weise zu überprüfen, ob ein Objekt der Klasse Attribut hat). Welche Klasse?
class(int)
# [1] AsIs
class(slope)
# [1] AsIs
Dies ist das Ergebnis I()
zu verwenden. Genau, sie erben solche Klasse von rs
und weiter von der Antwortvariablen. Das heißt, wenn wir I()
auf die Antwort verwenden, die RHS der Modellformel, erhalten wir dieses Verhalten.
Sie können hier ein paar Experiment tun:
So abline(a, b)
zu sehr empfindlich ist, ob das erste Argument a
hat Attributklasse oder nicht.
Warum? Weil abline
ein lineares Modellobjekt mit der Klasse "lm" akzeptieren kann. Innerhalb abline
:
if (is.object(a) || is.list(a)) {
p <- length(coefa <- as.vector(coef(a)))
Wenn a
eine Klasse hat, abline
wird es als Modellobjekt unter der Annahme (unabhängig davon, ob es wirklich ist !!!), dann versuchen coef
zu verwenden Koeffizienten zu erhalten.Die Überprüfung, die hier durchgeführt wird, ist ziemlich nicht robust; wir können abline
scheitern ziemlich leicht machen:
plot(0:1, 0:1)
a <- 0 ## plain numeric
abline(a, 1) ## OK
class(a) <- "whatever" ## add a class
abline(a, 1) ## oops, fails!!!
Error: $ operator is invalid for atomic vectors
So, hier ist das Ergebnis: vermeiden in der Modellformel I()
auf Ihre Antwortvariablen. Es ist OK, I()
auf Kovariaten zu haben, aber nicht auf Antwort. lm
und die meisten generischen Funktionen werden keine Probleme haben, damit umzugehen, aber plot.lm
wird.
Können Sie 'summary fit' posten? – Christoph
@Christoph Ich wollte gerade die Zusammenfassung posten, aber die Antwort von Zheyuan Li ergänzt meine Post ausreichend gut. – ZzKr