p-değerlerini çıkarır ve doğrusal bir regresyondan r-karesi alır


179

P-değerini (tek açıklayıcı değişkenin katsayısının sıfırdan farklı olması açısından) ve R-kare değerini basit bir doğrusal regresyon modelinden nasıl çıkarırsınız? Örneğin...

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

P-değerini ve R-kare değerini summary(fit) görüntülediğini biliyorum , ancak bunları diğer değişkenlere yapıştırabilmek istiyorum.


Değerleri yalnızca çıktıyı bir nesneye atamazsanız r <- summary(lm(rnorm(10)~runif(10)))görüntüler (örn . Hiçbir şey görüntülemez).
Joshua Ulrich

Yanıtlar:


157

r-kare : r-kare değerini doğrudan özet nesnesinden döndürebilirsiniz summary(fit)$r.squared. names(summary(fit))Doğrudan çıkarabileceğiniz tüm öğelerin listesi için bkz .

Model p-değeri: Genel regresyon modelinin p-değerini elde etmek istiyorsanız, bu blog yazısı p-değerini döndürmek için bir işlevi özetlemektedir:

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

Bir öngörücüyle basit bir regresyon durumunda, katsayı için model p değeri ve p değeri aynı olacaktır.

Katsayı p değerleri: Birden fazla öngörücünüz varsa, yukarıdaki model p değerini döndürür ve katsayılar için p değeri şu şekilde çıkarılabilir:

summary(fit)$coefficients[,4]  

Alternatif olarak, katsayıların p-değerini anova(fit)yukarıdaki özet nesneye benzer şekilde yakalayabilirsiniz .


13
Doğrudan kullanmak inheritsyerine kullanmak biraz daha iyidir class. Belki de istiyorsun unname(pf(f[1],f[2],f[3],lower.tail=F))?
hadley

150

Uyarı summary(fit)size gerekli olan tüm bilgileri içeren bir nesne oluşturur. Beta, se, t ve p vektörleri içinde saklanır. Katsayılar matrisinin (özet nesnede saklanan) 4. sütununu seçerek p-değerlerini alın:

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

Deneyin str(summary(fit))Bu nesnenin içerdiği tüm bilgileri görmeye .

Düzenleme: Temelde burada verdiğim şeye nasıl ulaşacağınızı söyleyen Chase'in cevabını yanlış okudum.


11
Not: Bu, kesişmenin p-değerine ve diğer öngörücülere kolay erişim sağlayan tek yöntemdir. Yukarıdakilerin en iyisi.
Daniel Egan

2
Bu doğru cevap. En çok oy alan cevap benim için çalışmadı.
Chris

8
P-DEĞERİNE KOLAY ERİŞİM İSTİYORSANIZ, BU CEVABI KULLANIN. Özet çıktısının kendisinde p-değeri bulmak için biraz daha zor bakmak zorunda kaldığınızda, neden çok satırlı işlevler yazarak veya yeni nesneler (örneğin, anova çıktıları) oluşturmaya devam edersiniz? Bireysel bir p-değerini izole etmek için, Vincent'ın cevabına bir satır numarası eklersiniz: örneğin, summary(fit)$coefficients[1,4] thei ntercept için
theforestecologist

2
Not: Bu yöntem kullanılarak oluşturulan modeller için çalışır, lm()ancak gls()modeller için çalışmaz .
theforestecologist

3
Chase'in cevabı modelin p değerini, bu cevap katsayıların p değerini döndürür. Basit bir gerileme durumunda, bunlar aynıdır, ancak birden fazla öngörücüye sahip bir model söz konusu olduğunda, bunlar aynı değildir. Bu nedenle, her iki cevap da ne çıkarmak istediğinize bağlı olarak faydalıdır.
Jeromy Anglim

44

Sen tarafından döndürülen nesnenin yapısını görebilirsiniz summary()arayarak str(summary(fit)). Her parçaya erişilebilir $. F istatistiği için p değeri, döndürülen nesneden daha kolaydır anova.

Kısacası, bunu yapabilirsiniz:

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

10
Bu sadece regresyon p
değerinin

23

Yukarıdaki cevapların her ikisi de iyi olmakla birlikte, nesnelerin parçalarını çıkarma prosedürü daha geneldir.

Çoğu durumda, işlevler listeleri döndürür str()ve bileşenleri adlarıyla birlikte yazdıracak şekilde tek tek bileşenlere erişilebilir . Daha sonra bunlara $ operatörünü, yani myobject$componentname.

Lm nesnelerin durumda, bir gibi kullanabileceğiniz önceden tanımlanmış bir dizi yöntem vardır coef(), resid(), summary()vb, ama her zaman bu kadar şanslı olmayacak.


23

Benzer bir sorun için önerilen çözümleri araştırırken bu soruya rastladım; İleride başvurmak için, mevcut cevap listesini bir çözümle güncellemenin faydalı olabileceğini varsayıyorum.broom paketi .

Basit kod

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

Sonuçlar

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

Yan notlar

glanceFonksiyonun anahtar değerleri düzgün bir şekilde özetlediği için yararlı buluyorum . Sonuçlar, data.framedaha fazla manipülasyonu kolaylaştıran bir şekilde saklanır :

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

Bu harika bir cevap!
Andrew Brēza

9

@Vincent'in cevabının uzatılması :

İçin lm()oluşturulan modeller:

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

İçin gls()oluşturulan modeller:

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

Tek bir p değerinin kendisini izole etmek için koda bir satır numarası eklersiniz:

Örneğin, her iki model özetinde kesişimin p değerine erişmek için:

summary(fit)$coefficients[1,4]
summary(fit)$tTable[1,4]  
  • Not: Yukarıdaki örneklerin her birinde sütun numarasını sütun adıyla değiştirebilirsiniz:

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

Özet tablosunun str()yapısını bulmak için özet tabloyu kullanarak bir değer formuna nasıl erişeceğinizden hala emin değilseniz :

str(summary(fit))

7

Bu p değerlerini almanın en kolay yoludur:

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

1
Bu yöntemi denedim, ancak doğrusal model herhangi bir NA terimi içeriyorsa başarısız olur
j_v_wow_d

5

Bu lmp işlevini birçok kez kullandım.

Bir noktada veri analizini geliştirmek için yeni özellikler eklemeye karar verdim. R veya istatistik konusunda uzman değilim ama insanlar genellikle doğrusal bir regresyonun farklı bilgilerine bakıyorlar:

  • p-değeri
  • a ve B
  • ve tabii ki nokta dağılımının yönü

Bir örnek verelim. Buradasın

Burada farklı değişkenlere sahip tekrarlanabilir bir örnek:

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)

Bu fonksiyondan kesinlikle daha hızlı bir çözüm var ama işe yarıyor.


2

Sonunda görüntülenen son p değeri için summary(), işlev değerlerden pf()hesaplamak için kullanır summary(fit)$fstatistic.

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

Kaynak: [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
Kısaca bu kodun neden çalıştığına dair bir açıklama yapmaya özen gösterilsin mi?
aribeiro

bu mevcut cevaplar (ve özellikle kabul edilen cevap) üzerinde nasıl gelişir?
Ben Bolker

0

Başka bir seçenek lm yerine cor.test işlevini kullanmaktır:

> 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

kullanın:

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

burada numkatsayılar matrisinin sırasını gösteren bir sayıdır. Modelinizde kaç tane özelliğe sahip olduğunuza ve p-değerini çekmek istediğinize bağlı olacaktır. Örneğin, yalnızca bir değişkeniniz varsa kesişme için bir p-değeri olacak ve bu değer [1,4], bir sonraki değişkeni ise gerçek değişkeniniz için [2,4] olacaktır. Yani num2 olacaksın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.