estrae i valori p e r al quadrato da una regressione lineare


179

Come si estrae il valore p (poiché la significatività del coefficiente della singola variabile esplicativa è diversa da zero) e il valore R al quadrato da un semplice modello di regressione lineare? Per esempio...

x = cumsum(c(0, runif(100, -1, +1)))
y = cumsum(c(0, runif(100, -1, +1)))
fit = lm(y ~ x)
summary(fit)

So che summary(fit) visualizza il valore p e il valore R al quadrato, ma voglio essere in grado di inserirli in altre variabili.


Visualizza i valori solo se non si assegna l'output a un oggetto (ad es. r <- summary(lm(rnorm(10)~runif(10)))Non si visualizza nulla).
Joshua Ulrich,

Risposte:


157

r-quadrato : è possibile restituire il valore di r-quadrato direttamente dall'oggetto di riepilogo summary(fit)$r.squared. Consulta l' names(summary(fit))elenco di tutti gli elementi che puoi estrarre direttamente.

Valore p del modello: se si desidera ottenere il valore p del modello di regressione generale, questo post del blog delinea una funzione per restituire il valore p:

lmp <- function (modelobject) {
    if (class(modelobject) != "lm") stop("Not an object of class 'lm' ")
    f <- summary(modelobject)$fstatistic
    p <- pf(f[1],f[2],f[3],lower.tail=F)
    attributes(p) <- NULL
    return(p)
}

> lmp(fit)
[1] 1.622665e-05

Nel caso di una semplice regressione con un predittore, il valore p del modello e il valore p del coefficiente saranno gli stessi.

Valori p coefficienti: se si dispone di più di un predittore, quanto sopra restituirà il valore p del modello e il valore p per i coefficienti può essere estratto usando:

summary(fit)$coefficients[,4]  

In alternativa, puoi prendere il valore p dei coefficienti anova(fit)dall'oggetto in modo simile all'oggetto di riepilogo sopra.


13
È un po 'meglio usare inheritspiuttosto che classdirettamente. E forse vuoi unname(pf(f[1],f[2],f[3],lower.tail=F))?
Hadley,

150

Si noti che summary(fit)genera un oggetto con tutte le informazioni necessarie. I vettori beta, se, te p sono memorizzati in esso. Ottieni i valori p selezionando la quarta colonna della matrice dei coefficienti (memorizzata nell'oggetto di riepilogo):

summary(fit)$coefficients[,4] 
summary(fit)$r.squared

Prova str(summary(fit))a vedere tutte le informazioni contenute in questo oggetto.

Modifica: ho letto male la risposta di Chase che sostanzialmente ti dice come arrivare a ciò che do qui.


11
Nota: questo è l'unico metodo che consente di accedere facilmente al valore p dell'intercetta e agli altri predittori. Di gran lunga il migliore di cui sopra.
Daniel Egan,

2
Questa è la risposta esatta. La risposta più votata NON ha funzionato per me.
Chris,

8
SE DESIDERI UN FACILE ACCESSO A P-VALUE, UTILIZZA QUESTA RISPOSTA. Perché dovresti passare attraverso la scrittura di funzioni multilinea o la creazione di nuovi oggetti (ad esempio, output anova), quando devi solo cercare un po 'più difficile trovare il valore p nell'output di riepilogo stesso. Per isolare un singolo valore p stesso, aggiungerei un numero di riga alla risposta di Vincent: ad esempio, summary(fit)$coefficients[1,4] per thei ntercept
theforestecologist

2
Nota: questo metodo funziona per i modelli creati utilizzando lm()ma non per i gls()modelli.
forestecologo il

3
La risposta di Chase restituisce il valore p del modello, questa risposta restituisce il valore p dei coefficienti. Nel caso di una semplice regressione, sono gli stessi, ma nel caso di un modello con predittori multipli, non sono gli stessi. Pertanto, entrambe le risposte sono utili a seconda di ciò che si desidera estrarre.
Jeromy Anglim,

44

Puoi vedere la struttura dell'oggetto restituita summary()chiamando str(summary(fit)). È possibile accedere a ciascun pezzo utilizzando $. Il valore p per la statistica F si ottiene più facilmente dall'oggetto restituito daanova .

In breve, puoi farlo:

rSquared <- summary(fit)$r.squared
pVal <- anova(fit)$'Pr(>F)'[1]

10
questo funziona solo per le regressioni univariate in cui il valore della regressione è lo stesso del predittore
Bakaburg,

23

Mentre entrambe le risposte sopra sono buone, la procedura per estrarre parti di oggetti è più generale.

In molti casi, le funzioni restituiscono gli elenchi e si accede ai singoli componenti mediante i str()quali verranno stampati i componenti insieme ai loro nomi. È quindi possibile accedervi utilizzando l'operatore $, ad es myobject$componentname.

In caso di oggetti lm, ci sono una serie di metodi predefiniti si possono utilizzare, come coef(), resid(), summary()ecc, ma vi sarà non essere sempre così fortunato.


23

Mi sono imbattuto in questa domanda mentre esploravo le soluzioni suggerite per un problema simile; Presumo che per riferimenti futuri potrebbe essere utile aggiornare l'elenco di risposte disponibili con una soluzione che utilizza ilbroom pacchetto.

Codice di esempio

x = cumsum(c(0, runif(100, -1, +1)))
y = cumsum(c(0, runif(100, -1, +1)))
fit = lm(y ~ x)
require(broom)
glance(fit)

risultati

>> glance(fit)
  r.squared adj.r.squared    sigma statistic    p.value df    logLik      AIC      BIC deviance df.residual
1 0.5442762     0.5396729 1.502943  118.2368 1.3719e-18  2 -183.4527 372.9055 380.7508 223.6251          99

Note a margine

Trovo che la glancefunzione sia utile in quanto riassume ordinatamente i valori chiave. I risultati vengono archiviati come uno data.frameche semplifica l'ulteriore manipolazione:

>> class(glance(fit))
[1] "data.frame"

Questa è un'ottima risposta!
Andrew Brēza,

9

Estensione della s' @Vincent risposta :

Per i lm()modelli generati:

summary(fit)$coefficients[,4]   ##P-values 
summary(fit)$r.squared          ##R squared values

Per i gls()modelli generati:

summary(fit)$tTable[,4]         ##P-values
##R-squared values are not generated b/c gls uses max-likelihood not Sums of Squares

Per isolare un singolo valore p, aggiungi un numero di riga al codice:

Ad esempio per accedere al valore p dell'intercetta in entrambi i riepiloghi del modello:

summary(fit)$coefficients[1,4]
summary(fit)$tTable[1,4]  
  • Nota, puoi sostituire il numero di colonna con il nome della colonna in ciascuna delle istanze sopra:

    summary(fit)$coefficients[1,"Pr(>|t|)"]  ##lm 
    summary(fit)$tTable[1,"p-value"]         ##gls 

Se non sei ancora sicuro di come accedere a un valore dalla tabella di riepilogo, utilizza str()per capire la struttura della tabella di riepilogo:

str(summary(fit))

7

Questo è il modo più semplice per estrarre i valori p:

coef(summary(modelname))[, "Pr(>|t|)"]

1
Ho provato questo metodo, ma fallirà se il modello lineare contiene termini NA
j_v_wow_d

5

Ho usato questa funzione lmp molte volte.

E ad un certo punto ho deciso di aggiungere nuove funzionalità per migliorare l'analisi dei dati. Non sono esperto di R o statistica ma le persone di solito stanno guardando diverse informazioni di una regressione lineare:

  • p-value
  • a e b
  • e ovviamente l'aspetto della distribuzione dei punti

Facciamo un esempio. Hai qui

Ecco un esempio riproducibile con diverse variabili:

Ex<-structure(list(X1 = c(-36.8598, -37.1726, -36.4343, -36.8644, 
-37.0599, -34.8818, -31.9907, -37.8304, -34.3367, -31.2984, -33.5731
), X2 = c(64.26, 63.085, 66.36, 61.08, 61.57, 65.04, 72.69, 63.83, 
67.555, 76.06, 68.61), Y1 = c(493.81544, 493.81544, 494.54173, 
494.61364, 494.61381, 494.38717, 494.64122, 493.73265, 494.04246, 
494.92989, 494.98384), Y2 = c(489.704166, 489.704166, 490.710962, 
490.653212, 490.710612, 489.822928, 488.160904, 489.747776, 490.600579, 
488.946738, 490.398958), Y3 = c(-19L, -19L, -19L, -23L, -30L, 
-43L, -43L, -2L, -58L, -47L, -61L)), .Names = c("X1", "X2", "Y1", 
"Y2", "Y3"), row.names = c(NA, 11L), class = "data.frame")


library(reshape2)
library(ggplot2)
Ex2<-melt(Ex,id=c("X1","X2"))
colnames(Ex2)[3:4]<-c("Y","Yvalue")
Ex3<-melt(Ex2,id=c("Y","Yvalue"))
colnames(Ex3)[3:4]<-c("X","Xvalue")

ggplot(Ex3,aes(Xvalue,Yvalue))+
          geom_smooth(method="lm",alpha=0.2,size=1,color="grey")+
          geom_point(size=2)+
          facet_grid(Y~X,scales='free')


#Use the lmp function

lmp <- function (modelobject) {
  if (class(modelobject) != "lm") stop("Not an object of class 'lm' ")
  f <- summary(modelobject)$fstatistic
    p <- pf(f[1],f[2],f[3],lower.tail=F)
    attributes(p) <- NULL
    return(p)
    }

# create function to extract different informations from lm

lmtable<-function (var1,var2,data,signi=NULL){
  #var1= y data : colnames of data as.character, so "Y1" or c("Y1","Y2") for example
  #var2= x data : colnames of data as.character, so "X1" or c("X1","X2") for example
  #data= data in dataframe, variables in columns
  # if signi TRUE, round p-value with 2 digits and add *** if <0.001, ** if < 0.01, * if < 0.05.

  if (class(data) != "data.frame") stop("Not an object of class 'data.frame' ")
  Tabtemp<-data.frame(matrix(NA,ncol=6,nrow=length(var1)*length(var2)))
  for (i in 1:length(var2))
       {
  Tabtemp[((length(var1)*i)-(length(var1)-1)):(length(var1)*i),1]<-var1
  Tabtemp[((length(var1)*i)-(length(var1)-1)):(length(var1)*i),2]<-var2[i]
  colnames(Tabtemp)<-c("Var.y","Var.x","p-value","a","b","r^2")

  for (n in 1:length(var1))
  {
  Tabtemp[(((length(var1)*i)-(length(var1)-1))+n-1),3]<-lmp(lm(data[,var1[n]]~data[,var2[i]],data))

  Tabtemp[(((length(var1)*i)-(length(var1)-1))+n-1),4]<-coef(lm(data[,var1[n]]~data[,var2[i]],data))[1]

  Tabtemp[(((length(var1)*i)-(length(var1)-1))+n-1),5]<-coef(lm(data[,var1[n]]~data[,var2[i]],data))[2]

  Tabtemp[(((length(var1)*i)-(length(var1)-1))+n-1),6]<-summary(lm(data[,var1[n]]~data[,var2[i]],data))$r.squared
  }
  }

  signi2<-data.frame(matrix(NA,ncol=3,nrow=nrow(Tabtemp)))
  signi2[,1]<-ifelse(Tabtemp[,3]<0.001,paste0("***"),ifelse(Tabtemp[,3]<0.01,paste0("**"),ifelse(Tabtemp[,3]<0.05,paste0("*"),paste0(""))))
  signi2[,2]<-round(Tabtemp[,3],2)
  signi2[,3]<-paste0(format(signi2[,2],digits=2),signi2[,1])

  for (l in 1:nrow(Tabtemp))
    {
  Tabtemp$"p-value"[l]<-ifelse(is.null(signi),
         Tabtemp$"p-value"[l],
         ifelse(isTRUE(signi),
                paste0(signi2[,3][l]),
                Tabtemp$"p-value"[l]))
  }

   Tabtemp
}

# ------- EXAMPLES ------

lmtable("Y1","X1",Ex)
lmtable(c("Y1","Y2","Y3"),c("X1","X2"),Ex)
lmtable(c("Y1","Y2","Y3"),c("X1","X2"),Ex,signi=TRUE)

Esiste sicuramente una soluzione più veloce di questa funzione ma funziona.


2

Per il valore p finale visualizzato alla fine di summary(), la funzione utilizza pf()per calcolare dai summary(fit)$fstatisticvalori.

fstat <- summary(fit)$fstatistic
pf(fstat[1], fstat[2], fstat[3], lower.tail=FALSE)

Fonte: [1] , [2]


1
x = cumsum(c(0, runif(100, -1, +1)))
y = cumsum(c(0, runif(100, -1, +1)))
fit = lm(y ~ x)
> names(summary(fit))
[1] "call"          "terms"        
 [3] "residuals"     "coefficients" 
 [5] "aliased"       "sigma"        
 [7] "df"            "r.squared"    
 [9] "adj.r.squared" "fstatistic"   
[11] "cov.unscaled" 
    summary(fit)$r.squared

1
Vuoi fornire una spiegazione, anche se brevemente, sul perché questo codice funziona?
aribeiro,

come migliora le risposte esistenti (e in particolare la risposta accettata)?
Ben Bolker,

0

Un'altra opzione è usare la funzione cor.test, invece di lm:

> x <- c(44.4, 45.9, 41.9, 53.3, 44.7, 44.1, 50.7, 45.2, 60.1)
> y <- c( 2.6,  3.1,  2.5,  5.0,  3.6,  4.0,  5.2,  2.8,  3.8)

> mycor = cor.test(x,y)
> mylm = lm(x~y)

# r and rsquared:
> cor.test(x,y)$estimate ** 2
      cor 
0.3262484 
> summary(lm(x~y))$r.squared
[1] 0.3262484

# P.value 

> lmp(lm(x~y))  # Using the lmp function defined in Chase's answer
[1] 0.1081731
> cor.test(x,y)$p.value
[1] 0.1081731

0

Uso:

(summary(fit))$coefficients[***num***,4]

dove numè un numero che indica la riga della matrice dei coefficienti. Dipenderà da quante funzioni hai nel tuo modello e da quale vuoi estrarre il valore p. Ad esempio, se hai solo una variabile, ci sarà un valore p per l'intercettazione che sarà [1,4] e il successivo per la tua variabile effettiva che sarà [2,4]. Quindi il tuo numsarà 2.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.