Skip to content

extract the p value

4 messages · Jim Bouldin, Joshua Wiley, R. Michael Weylandt +1 more

#
Hi Jim,

Its a bit of a trick question.  There isn't actually any overall p
value stored in the lm object, or even in the summary.lm object.  It
is calculated from the f statistic by the print methods for
summary.lm.  Of course, none of that helps, per se.  Try this:

summary(lm(mpg ~ hp, data = mtcars))$fstatistic

f <- summary(lm(mpg ~ hp, data = mtcars))$fstatistic

## get p-value
pf(q = f[1], df1 = f[2], df2 = f[3], lower.tail = FALSE)

If you are interested in tracking things "under the hood":

# show methods for summary
methods(summary)
# leads to
summary.lm

## shows the structure of the summary
str(summary(lm(mpg ~ hp, data = mtcars)))

hmm no p value

how is the summary shown? it must be printed, which happens silently

methods(print)

leading us to: print.summary.lm*

the asterisk means it is a non-exported object, so to view the source
will take a bit more work.  From experience I know it is in the stats
package, so:

stats:::print.summary.lm

shows the code for the print method for summary.lm objects.  Towards
the end, you'll see:

    cat(",\tAdjusted R-squared:", formatC(x$adj.r.squared,
            digits = digits), "\nF-statistic:", formatC(x$fstatistic[1L],
            digits = digits), "on", x$fstatistic[2L], "and",
            x$fstatistic[3L], "DF,  p-value:", format.pval(pf(x$fstatistic[1L],
                x$fstatistic[2L], x$fstatistic[3L], lower.tail = FALSE),
                digits = digits), "\n")
    }

which is where it gets and outputs to the console the p value.

HTH,

Josh
On Mon, Oct 24, 2011 at 10:47 AM, Jim Bouldin <bouldinjr at gmail.com> wrote:

  
    
#
It's not directly extractable since it's calculated on the fly in the
printing method. If you type stats:::print.summary.lm,  you can see
the code the leads to the calculation: It's basically (I'm leaving out
some formatting stuff):

pf(x$fstatistic[1L], x$fstatistic[2L], x$fstatistic[3L], lower.tail = FALSE)

where the fstatistic is calculated in summary.lm. You can write a
little helper to calculate this yourself -- just something like

getModelPValue <- function(m) {
    stopifnot(inherits(m, "lm"))
    s <- summary.lm(m)
    pf(s$fstatistic[1L], s$fstatistic[2L], s$fstatistic[3L], lower.tail = FALSE)
}

And you can just extract the necessary parts of summary.lm if speed is
a concern.

Hope this helps,

Michael
On Mon, Oct 24, 2011 at 1:47 PM, Jim Bouldin <bouldinjr at gmail.com> wrote:
#
On 24/10/2011 1:47 PM, Jim Bouldin wrote:
It's not part of the object, it is computed when the object is printed.  
To see the print method, do this:

class(test2[[1]])

(which will print "summary.lm" if I'm reading your code properly).  Then 
print.summary.lm is the print method:

getAnywhere(print.summary.lm)

It's fairly long, but I think the part you want is

         cat(",\tAdjusted R-squared:", formatC(x$adj.r.squared,
             digits = digits), "\nF-statistic:", formatC(x$fstatistic[1L],
             digits = digits), "on", x$fstatistic[2L], "and",
             x$fstatistic[3L], "DF,  p-value:", 
format.pval(pf(x$fstatistic[1L],
                 x$fstatistic[2L], x$fstatistic[3L], lower.tail = FALSE),
                 digits = digits), "\n")

Here, x is the summary object.

Duncan Murdoch