r - plot.lm Error: $ operator is invalid for atomic vectors -


i have following regression model transformations:

fit <- lm( i(newvalue ^ (1 / 3)) ~ i(currentvalue ^ (1 / 3)) + age + type - 1,            data = datareg) plot(fit)                                                                       

but plot gives me following error:

error: $ operator invalid atomic vectors 

any ideas doing wrong?

note: summary, predict, , residuals work correctly.

this quite interesting observation. in fact, among 6 plots supported plot.lm, q-q plot fails in case. consider following reproducible example:

x <- runif(20) y <- runif(20) fit <- lm(i(y ^ (1/3)) ~ i(x ^ (1/3))) ## `which = 2l` (qq plot) fails; `which = 1, 3, 4, 5, 6` work stats:::plot.lm(fit, = 2l) 

inside plot.lm, q-q plot produced follow:

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)  ## fails!!! 

error: $ operator invalid atomic vectors

so purely problem of abline function! note:

is.object(int) # [1] true  is.object(slope) # [1] true 

i.e., both int , slope has class attribute (read ?is.object; efficient way check whether object has class attribute). class?

class(int) # [1] asis  class(slope) # [1] asis 

this result of using i(). precisely, inherits such class rs , further response variable. is, if use i() on response, rhs of model formula, behaviour.

you can few experiment here:

abline(as.numeric(int), as.numeric(slope))  ## ok abline(as.numeric(int), slope)  ## ok abline(int, as.numeric(slope))  ## fails!! abline(int, slope)  ## fails!! 

so abline(a, b) sensitive whether first argument a has class attribute or not.

why? because abline can accept linear model object "lm" class. inside abline:

if (is.object(a) || is.list(a)) {     p <- length(coefa <- as.vector(coef(a))) 

if a has class, abline assuming model object (regardless whether is!!!), try use coef obtain coefficients. check being done here not robust; can make abline fail rather easily:

plot(0:1, 0:1) <- 0  ## plain numeric abline(a, 1)  ## ok class(a) <- "whatever"  ## add class abline(a, 1)  ## oops, fails!!! 

error: $ operator invalid atomic vectors

so here conclusion: avoid using i() on response variable in model formula. ok have i() on covariates, not on response. lm , generic functions won't have trouble dealing this, plot.lm will.


Comments

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -