एक रेखीय प्रतिगमन से p-मान और r-squared को बाहर निकालें


179

आप एक साधारण रेखीय प्रतिगमन मॉडल से पी-मान (एकल व्याख्यात्मक चर के गैर-शून्य के गुणांक के महत्व के लिए) और आर-स्क्वेर्ड मूल्य को कैसे निकालते हैं? उदाहरण के लिए...

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

मुझे पता है कि पी-वैल्यू और आर-स्क्वेर्ड वैल्यू summary(fit) प्रदर्शित करता है, लेकिन मैं इन्हें दूसरे वेरिएबल्स में स्टिक करने में सक्षम होना चाहता हूं।


यदि आप किसी ऑब्जेक्ट को आउटपुट असाइन नहीं करते (जैसे r <- summary(lm(rnorm(10)~runif(10)))कुछ प्रदर्शित नहीं करता है) तो यह केवल मान प्रदर्शित करता है ।
जोशुआ उलरिच

जवाबों:


157

r-squared : आप r-squared मान को सीधे सारांश ऑब्जेक्ट से वापस कर सकते हैं summary(fit)$r.squarednames(summary(fit))उन सभी वस्तुओं की सूची देखें जिन्हें आप सीधे निकाल सकते हैं।

मॉडल पी-मूल्य: यदि आप समग्र प्रतिगमन मॉडल का पी-मूल्य प्राप्त करना चाहते हैं, तो यह ब्लॉग पोस्ट पी-मूल्य को वापस करने के लिए एक फ़ंक्शन को रेखांकित करता है:

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

एक भविष्यवक्ता के साथ एक साधारण प्रतिगमन के मामले में, मॉडल पी-मूल्य और गुणांक के लिए पी-मूल्य समान होगा।

गुणांक पी-मान: यदि आपके पास एक से अधिक भविष्यवाणियां हैं, तो उपरोक्त मॉडल पी-मूल्य लौटाएगा, और गुणांक के लिए पी-मूल्य का उपयोग करके निकाला जा सकता है:

summary(fit)$coefficients[,4]  

वैकल्पिक रूप से, आप anova(fit)ऑब्जेक्ट से गुणांक के पी-मूल्य को समान रूप से उपरोक्त सारांश ऑब्जेक्ट से हड़प सकते हैं ।


13
यह सीधे उपयोग करने के inheritsबजाय थोड़ा बेहतर है class। और शायद आप चाहते हैं unname(pf(f[1],f[2],f[3],lower.tail=F))?
हैडले

150

ध्यान दें कि summary(fit)आपके द्वारा आवश्यक सभी जानकारी के साथ एक ऑब्जेक्ट उत्पन्न होता है। इसमें बीटा, एसई, टी और पी वैक्टर स्टोर किए जाते हैं। गुणांक मैट्रिक्स के 4 वें कॉलम का चयन करके पी-मान प्राप्त करें (सारांश ऑब्जेक्ट में संग्रहीत):

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

str(summary(fit))इस ऑब्जेक्ट में मौजूद सभी जानकारी को देखने का प्रयास करें ।

संपादित करें: मैंने चेस के उत्तर को गलत बताया था जो मूल रूप से आपको बताता है कि मैं यहां क्या देता हूं।


11
नोट: यह एकमात्र तरीका है जो आपको इंटरसेप्ट के पी-वैल्यू के साथ-साथ अन्य भविष्यवक्ताओं के लिए आसान पहुंच प्रदान करता है। अब तक ऊपर का सबसे अच्छा।
डैनियल ईगन

2
यह सही जवाब है। शीर्ष-रेटेड उत्तर ने मेरे लिए काम नहीं किया।
क्रिस

8
यदि आप पी-वैल्यू में आसानी चाहते हैं, तो इस का उपयोग करें। आप मल्टी-लाइन फ़ंक्शंस लिखने या नई ऑब्जेक्ट्स बनाने (यानी एनोवा आउटपुट) के माध्यम से क्यों जाएंगे, जब आपको सारांश आउटपुट में पी-वैल्यू खोजने के लिए बस थोड़ा कठिन दिखना होगा। व्यक्तिगत पी-मान को अलग करने के लिए, आप विन्सेन्ट के उत्तर में एक पंक्ति संख्या जोड़ेंगे: उदाहरण के लिए, summary(fit)$coefficients[1,4] thei ntercept
theforestecologist

2
नोट: यह विधि उपयोग किए गए मॉडल के लिए काम करती है lm()लेकिन gls()मॉडल के लिए काम नहीं करती है ।
theforestecologist

3
चेस का जवाब मॉडल का पी-मूल्य लौटाता है, यह उत्तर गुणांक के पी-मूल्य को लौटाता है। एक साधारण प्रतिगमन के मामले में, वे एक ही हैं, लेकिन कई भविष्यवक्ताओं के साथ एक मॉडल के मामले में, वे समान नहीं हैं। इस प्रकार, आप जो भी निकालना चाहते हैं, उसके आधार पर दोनों उत्तर उपयोगी हैं।
जेरोमे एंग्लीम

44

आप summary()कॉल करके लौटाए गए ऑब्जेक्ट की संरचना देख सकते हैं str(summary(fit))। प्रत्येक टुकड़े का उपयोग करके पहुँचा जा सकता है $। एफ स्टेटिस्टिक के लिए पी-वैल्यू अधिक आसानी से लौटाए गए ऑब्जेक्ट से था anova

अफसोस, आप ऐसा कर सकते हैं:

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


23

हालांकि उपरोक्त दोनों उत्तर अच्छे हैं, वस्तुओं के कुछ हिस्सों को निकालने की प्रक्रिया अधिक सामान्य है।

कई मामलों में, फ़ंक्शन सूची में लौटते हैं, और व्यक्तिगत घटकों का उपयोग किया जा सकता है str()जो घटकों को उनके नामों के साथ प्रिंट करेगा। तब आप $ ऑपरेटर अर्थात का उपयोग करके उन्हें एक्सेस कर सकते हैं myobject$componentname

एल एम वस्तुओं के मामले में, वहाँ पूर्वनिर्धारित तरीकों ऐसे ही एक के रूप में उपयोग कर सकते हैं की एक संख्या हैं coef(), resid(), summary()आदि, लेकिन आप हमेशा इतना भाग्यशाली नहीं होगा।


23

इसी तरह की समस्या के लिए सुझाए गए समाधानों की खोज करते हुए मैं इस सवाल पर आया; मुझे लगता है कि भविष्य के संदर्भ के लिए broomपैकेज के उपयोग के समाधान के साथ उत्तर की उपलब्ध सूची को अपडेट करना सार्थक हो सकता है ।

नमूना कोड

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

परिणाम

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

साइड नोट्स

मुझे लगता है कि यह glanceफ़ंक्शन उपयोगी है क्योंकि यह महत्वपूर्ण मानों को संक्षेप में प्रस्तुत करता है। परिणाम एक के रूप में संग्रहीत किए जाते हैं data.frameजो आगे हेरफेर आसान बनाता है:

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

यह एक महान जवाब है!
एंड्रयू ब्रूजा

9

@Vincent के उत्तर का विस्तार :

के लिए lm()उत्पन्न मॉडल:

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

के लिए gls()उत्पन्न मॉडल:

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

एक व्यक्तिगत पी-मूल्य को अलग करने के लिए, आप एक पंक्ति संख्या को कोड में जोड़ेंगे:

उदाहरण के लिए दोनों मॉडल सारांश में अवरोधन के पी-मूल्य का उपयोग करने के लिए:

summary(fit)$coefficients[1,4]
summary(fit)$tTable[1,4]  
  • ध्यान दें, आप ऊपर दिए गए प्रत्येक उदाहरण में कॉलम नंबर को कॉलम नाम से बदल सकते हैं:

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

यदि आप अभी भी इस बात के बारे में अनिश्चित हैं कि मान तालिका str()की संरचना का पता लगाने के लिए सारांश तालिका के उपयोग के मूल्य का उपयोग कैसे करें :

str(summary(fit))

7

यह पी-वैल्यू खींचने का सबसे आसान तरीका है:

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

1
मैंने इस पद्धति को आजमाया, लेकिन यह विफल हो जाएगा यदि रैखिक मॉडल में कोई NA शब्द हों
j_v_wow_d

5

मैंने कई बार इस lmp फंक्शन का इस्तेमाल किया।

और एक बिंदु पर मैंने डेटा विश्लेषण को बढ़ाने के लिए नई सुविधाओं को जोड़ने का फैसला किया। मैं आर या सांख्यिकी में विशेषज्ञ नहीं हूं, लेकिन लोग आमतौर पर एक रेखीय प्रतिगमन की विभिन्न जानकारी देख रहे हैं:

  • पी-मूल्य
  • ए और बी
  • और निश्चित रूप से बिंदु वितरण का पहलू

चलो एक उदाहरण है। आपके यहाँ है

यहाँ विभिन्न वेरिएबल्स के साथ एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है:

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)

इस फ़ंक्शन की तुलना में निश्चित रूप से तेज़ समाधान है लेकिन यह काम करता है।


2

के अंत में प्रदर्शित अंतिम पी-मूल्य के लिए summary(), फ़ंक्शन मानों pf()से गणना करने के लिए उपयोग करता है summary(fit)$fstatistic

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

स्रोत: [१] , [२]


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
एक स्पष्टीकरण देने की देखभाल, भले ही संक्षेप में, यह कोड क्यों काम करता है?
अराइबिरो

यह मौजूदा उत्तरों (और विशेष रूप से स्वीकृत उत्तर) पर कैसे सुधार करता है?
बेन बोलकर

0

एक और विकल्प lm के बजाय cor.test फ़ंक्शन का उपयोग करना है:

> 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

उपयोग:

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

जहां numएक संख्या है जो गुणांक मैट्रिक्स की पंक्ति को दर्शाता है। यह इस बात पर निर्भर करेगा कि आपके मॉडल में कितनी विशेषताएं हैं और आप किसके लिए पी-वैल्यू खींचना चाहते हैं। उदाहरण के लिए, यदि आपके पास केवल एक चर है, तो अवरोधन के लिए एक p- मान होगा जो कि [1,4] होगा और आपके वास्तविक चर के लिए अगला एक होगा जो [2,4] होगा। तो आपके num2 होंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.