2016-11-13 2 views
2

Ich habe folgendes Regressionsmodell mit Transformationen:

fit <- lm(I(NewValue^(1/3)) ~ I(CurrentValue^(1/3)) + Age + Type - 1, 
      data = dataReg) 
plot(fit)                  

Aber plot gibt mir die folgende Fehlermeldung:

Error: $ operator is invalid for atomic vectors 

Irgendwelche Ideen über das, was Ich mache falsch?

Hinweis: summary, predict und residuals alle korrekt funktionieren.

+0

Können Sie 'summary fit' posten? – Christoph

+0

@Christoph Ich wollte gerade die Zusammenfassung posten, aber die Antwort von Zheyuan Li ergänzt meine Post ausreichend gut. – ZzKr

Antwort

4

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.

+1

Tatsächlich wurde das Residual - Angepasste Diagramm korrekt erstellt, während das Problem beim Zeichnen des Q - Q - Diagramms auftrat. Wenn ich es vermeide() läuft alles reibungslos. – ZzKr

Verwandte Themen