web-dev-qa-db-fra.com

extraire les valeurs p et le carré de la régression linéaire

Comment extrayez-vous la valeur p (pour la signification du coefficient de la variable explicative unique non nul) et la valeur R au carré d'un modèle de régression linéaire simple? Par exemple...

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

Je sais que summary(fit)affiche la valeur p et la valeur R au carré, mais je veux pouvoir les coller dans d'autres variables.

160
grautur

r-squared : Vous pouvez renvoyer la valeur de r-squared directement à partir de l'objet récapitulatif summary(fit)$r.squared. Voir names(summary(fit)) pour une liste de tous les éléments que vous pouvez extraire directement.

Modèle p-value: Si vous souhaitez obtenir la valeur p du modèle de régression global, cet article de blog décrit un fonction pour retourner la valeur 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

Dans le cas d'une régression simple avec un prédicteur, la valeur p du modèle et la valeur p du coefficient seront les mêmes.

Coefficients p: Si vous avez plus d'un prédicteur, les valeurs ci-dessus renverront la valeur p du modèle et la valeur p des coefficients peut être extrait en utilisant:

summary(fit)$coefficients[,4]  

Vous pouvez également saisir la valeur p des coefficients à partir de l'objet anova(fit) d'une manière similaire à l'objet récapitulatif ci-dessus.

129
Chase

Notez que summary(fit) génère un objet avec toutes les informations dont vous avez besoin. Les vecteurs bêta, se, t et p y sont stockés. Obtenez les valeurs p en sélectionnant la 4ème colonne de la matrice de coefficients (stockée dans l'objet récapitulatif):

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

Essayez str(summary(fit)) pour voir toutes les informations contenues dans cet objet.

Edit: J'avais mal interprété la réponse de Chase qui vous dit en gros comment arriver à ce que je donne ici.

139
Vincent

Vous pouvez voir la structure de l'objet renvoyé par summary() en appelant str(summary(fit)). Chaque pièce est accessible avec $. La valeur p de la statistique F provient plus facilement de l'objet renvoyé par anova.

De manière concise, vous pouvez faire ceci:

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

Bien que les deux réponses ci-dessus soient bonnes, la procédure d'extraction de parties d'objets est plus générale.

Dans de nombreux cas, les fonctions renvoient des listes et les composants individuels sont accessibles à l’aide de str(), qui permet d’imprimer les composants avec leurs noms. Vous pouvez ensuite y accéder à l’aide de l’opérateur $, c’est-à-dire myobject$componentname.

Dans le cas des objets lm, il existe un certain nombre de méthodes prédéfinies que vous pouvez utiliser, telles que coef(), resid(), summary() etc., mais vous ne serez pas toujours aussi chanceux.

22
richiemorrisroe

J'ai croisé cette question tout en explorant des solutions suggérées pour un problème similaire; Je suppose que pour référence future, il peut être intéressant de mettre à jour la liste de réponses disponible avec une solution utilisant le package broom .

Exemple de code

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

Résultats

>> 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

Notes de côté

Je trouve la fonction glance utile car elle résume parfaitement les valeurs utiles. Comme avantage supplémentaire, les résultats sont stockés sous forme de data.frame, ce qui facilite la manipulation ultérieure:

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

Extension de @Vincent réponse :

Pour les modèles générés par lm():

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

Pour les modèles générés par gls():

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

Pour isoler une valeur p individuelle, ajoutez un numéro de ligne au code:

Par exemple, pour accéder à la valeur p de l'interception dans les deux résumés de modèle:

summary(fit)$coefficients[1,4]
summary(fit)$tTable[1,4]  
  • Notez que vous pouvez remplacer le numéro de colonne par le nom de la colonne dans chacune des instances ci-dessus:

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

Si vous ne savez toujours pas comment accéder à une valeur du tableau récapitulatif, utilisez str() pour comprendre la structure du tableau récapitulatif:

str(summary(fit))
7
theforestecologist

C'est le moyen le plus simple d'extraire les valeurs p:

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

J'ai utilisé cette fonction lmp assez souvent.

Et à un moment donné, j'ai décidé d'ajouter de nouvelles fonctionnalités pour améliorer l'analyse des données. Je ne suis pas expert en R ni en statistique mais les gens regardent généralement différentes informations d'une régression linéaire:

  • valeur p
  • a et b
  • et bien sûr l'aspect de la distribution des points

Ayons un exemple. Vous avez ici

Voici un exemple reproductible avec différentes variables:

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)

Il existe certainement une solution plus rapide que cette fonction, mais cela fonctionne.

5
Dorian Grv

Pour la valeur p finale affichée à la fin de summary(), la fonction utilise pf() pour calculer à partir des valeurs summary(fit)$fstatistic.

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

Source: [1] , [2]

1
Saftever
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
Jojo

Utilisation:

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

num est un nombre qui désigne la ligne de la matrice de coefficients. Cela dépendra du nombre de fonctionnalités de votre modèle et de celles pour lesquelles vous souhaitez extraire la valeur p. Par exemple, si vous n'avez qu'une seule variable, il y aura une p-valeur pour l'interception qui sera [1,4] et la suivante pour votre variable réelle qui sera [2,4]. Donc, votre num sera 2.

0
Tirtha