Skip to content

how exactly does 'identify' work?

8 messages · Duncan Murdoch, casperyc, Greg Snow

#
Hi all,

#########################################
test=data.frame(x=1:26,y=-23.5+0.45*(1:26)+rnorm(26))
rownames(test)=LETTERS[1:26]
attach(test)
#test
test.lm=lm(y~x)

plot(test.lm,2)
identify(test.lm$res,,row.names(test))
# not working

plot(x,y)
identify(x,y,row.names(test))
# works fine
identify(y,,row.names(test))
# works fine
identify(x,,row.names(test))
# not working
identify(y,,y)
# works
identify(x,,y)
# not working

#####################################

My guess is that identify take the object 'x' ( the first argument ) is the
thing that on the y axis.

However, i have tried many many ways 
trying to get the LETTERS to be identified in the QQ-plot (plot(test.lm,2))
it never works.....

I have even tried to extract the standardized residual using library(MASS),
the 'stdres' function, and put it as the first argument in identify,
still failed...

Is there any means to achieve this?

Thanks!

casper
1 day later
#
I think that your problem comes from a misunderstanding.

The general rule is that you give the plot command 2 vectors, x and y (though you can give it the vectors separately, or together in a list or matrix).  If you give plot only a single vector then it will use this as the y vector and use the sequence of integers from 1 to the length of y as the x variable.  Now in your example that matches your x exactly. 

In your working examples you either give the function both x and y, or only y and the generated sequence for x happens to match your x for this specific example, but not in general.  For your non-working examples you give only the x variable, which is then used as the y variable and the sequence is generated for x, so it will only identify points along the diagonal.  It does not know where to find your y variable.

The fix, always give both x and y (the fact that your examples worked with only y is due to your specific example, not anything general).
#
Hi, 

I think the problem is

1 - when a linear model is fitted, ploting the qqnorm( test.lm$ res )
we dont 'know' what values are actually being used on the y-axis; and
how do we refer to the ?Index? on the x-axis??
     therefore, i dont know how to refer to the x and y coordinates in the
identify function

2 - i have tried using the stdres function in the MASS library, to extract
the standardised
residuals and plot them manully, ( using the plot ) function.
     this way, the problem is we have to SORT the residuals first in
increasing order to reproduce the same qqnorm plot, in that case, 'identify'
function works, however, that CHANGES the order, i.e. it wont return the
original A:Z ( row.names ) label.
#
On 18/11/2010 1:50 PM, casperyc wrote:
You could look at qqnorm.default to figure those things out, but it is 
probably difficult to do.  You'd be better off using locator() to find 
the coordinates of a mouse click, and plotting the label using text().

For a simple example,

x <- rnorm(100, mean=10, sd=2)
qqnorm(x)
repeat {
   pt <- locator(1)
   if (!length(pt$x)) break
   text(pt, labels=which.min( abs(x - pt$y) ) )
}

Duncan Murdoch
#
yes, i tried to modify the "2L" part in plot.lm

###################################
if (show[2L]) {
        ylim <- range(rs, na.rm = TRUE)
        ylim[2L] <- ylim[2L] + diff(ylim) * 0.075
        qq <- qqnorm(rs, main = main, ylab = ylab23, ylim = ylim, 
            ...)
        if (qqline) 
            qqline(rs, lty = 3, col = "gray50")
        if (one.fig) 
            title(sub = sub.caption, ...)
        mtext(getCaption(2), 3, 0.25, cex = cex.caption)
        if (id.n > 0) 
            text.id(qq$x[show.rs], qq$y[show.rs], rs)
###################################

but didnt go very far,

I could just use text to add the label,
I just dont understand why identify does not 'identify' the residuals in
a linear model in the qqnorm plot ...

Thanks.
#
Did you read the help page for qqnorm?  The return value has the x and y coordinates used, you can just do something like:
Or the plot.lm function has an argument id.n that automatically labels the n most extreme values:
Those both worked in my tests, if they are not working for you then send a reproducible example (include data, see ?dput) and maybe we can help further.
#
One additional point on your original post.  You added row names to the test data frame, but did not specify the name of the data frame when you did the regression, rather you attached the data frame.  When you did this lm found x and y, but did not find the rownames, so the diagnostic plot just used numbers to label the extreme points.

This is just one of the many pitfalls with using attach rather than the more direct methods, try your example again but instead of attaching the data frame use it in the data argument to lm:
Then when you do plot(test.lm, 2) the most extreme points (3 if you don't change the id.n value) will be labeled using the rownames.
#
Omg!

yes, it is working now!

tmp <- qqnorm( resid(test.lm) ) 

What a simple nice trick!!!

Actually, i wasnt looking for the 'i'th label,
I was looking for the 'row.names' as label,
like I stated in the 1st post.
is the label i have been trying to get.


THANKS!

casper