লিনিয়ার রিগ্রেশন থেকে পি-মানগুলি এবং আর-স্কোয়ারটি টানুন


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

আর-স্কোয়ার : আপনি সংক্ষিপ্ত বস্তু থেকে সরাসরি আর-স্কোয়ার মানটি ফিরিয়ে দিতে পারেন summary(fit)$r.squared। আপনি names(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)উপরের সংক্ষিপ্ত বস্তুটির অনুরূপ ফ্যাশনে অবজেক্ট থেকে গুণফলের পি-মানটি ধরতে পারেন grab


13
সরাসরি inheritsনা বরং ব্যবহার করা কিছুটা ভাল class। এবং আপনি চান unname(pf(f[1],f[2],f[3],lower.tail=F))?
হ্যাডলি

150

লক্ষ্য করুন যা summary(fit)আপনার প্রয়োজনীয় সমস্ত তথ্য সহ একটি অবজেক্ট তৈরি করে। এতে বিটা, সে, টি এবং পি ভেক্টর সঞ্চিত রয়েছে। সহগ ম্যাট্রিক্সের চতুর্থ কলামটি (সংক্ষিপ্ত বস্তুতে সঞ্চিত) নির্বাচন করে পি-মানগুলি পান:

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

চেষ্টা str(summary(fit))এই অবজেক্টটিতে থাকা সমস্ত তথ্য দেখার ।

সম্পাদনা করুন: আমি চেজের উত্তর ভুল করে পড়েছিলাম যা মূলত আপনাকে জানায় যে আমি এখানে যা দিচ্ছি তা কীভাবে পাবেন।


11
দ্রষ্টব্য: এটিই একমাত্র পদ্ধতি যা আপনাকে বাধা দানের পাশাপাশি ইন্টারসেপ্টের পি-ভ্যালুতে সহজে অ্যাক্সেস দেয়। এখন পর্যন্ত উপরের সেরা।
ড্যানিয়েল ইগান

2
এটি সঠিক উত্তর। শীর্ষ রেট করা উত্তর আমার পক্ষে কার্যকর হয়নি।
ক্রিস

8
আপনি যদি পি ভ্যালুয়ে সহজেই প্রবেশ করতে চান তবে এই উত্তরটি ব্যবহার করুন। আপনি কেন মাল্টি-লাইন ফাংশনগুলি লেখার মাধ্যমে বা নতুন অবজেক্টগুলি (যেমন, আনোভা আউটপুট) তৈরি করতে যাবেন, যখন আপনাকে সামান্য আউটপুটে নিজেই পি-মান খুঁজে পেতে কিছুটা কঠিন দেখতে হবে। একটি পৃথক পি-মান নিজেই বিচ্ছিন্ন করতে, আপনি ভিনসেন্টের উত্তরে একটি সারি সংখ্যা যুক্ত করবেন: উদাহরণস্বরূপ, summary(fit)$coefficients[1,4] থি নটারসেপ্টের জন্য
নভোবিজ্ঞানী

2
দ্রষ্টব্য: এই পদ্ধতিটি তৈরির মাধ্যমে তৈরি মডেলগুলির জন্য কাজ করে lm()তবে gls()মডেলগুলির জন্য কাজ করে না ।
বনাঞ্চল বিশেষজ্ঞ

3
চেজের উত্তরটি মডেলের পি-মান দেয়, এই উত্তরটি সহগের p-মান প্রদান করে। সাধারণ রিগ্রেশনের ক্ষেত্রে এগুলি একই, তবে একাধিক ভবিষ্যদ্বাণীকারীদের সাথে মডেলের ক্ষেত্রে তারা একই হয় না। সুতরাং, উভয় উত্তর আপনি কী নিষ্কাশন করতে চান তার উপর নির্ভর করে দরকারী।
জেরোমি অ্যাংলিম

44

আপনি বস্তু দ্বারা ফিরে কাঠামো দেখতে পারেন summary()কল করে str(summary(fit))। প্রতিটি টুকরা ব্যবহার করে অ্যাক্সেস করা যেতে পারে $। F পরিসংখ্যানগুলির জন্য পি-মানটি সহজেই ফিরে আসা বস্তু থেকে পাওয়া যায় anova

সংক্ষিপ্তভাবে, আপনি এটি করতে পারেন:

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


23

উপরের উভয় উত্তর ভাল হলেও বস্তুর অংশ বের করার পদ্ধতিটি আরও সাধারণ।

অনেক ক্ষেত্রে ফাংশন তালিকা দেয় এবং পৃথক উপাদানগুলি ব্যবহার করে অ্যাক্সেস করা যায় str()যা তাদের নামগুলি সহ উপাদানগুলি মুদ্রণ করবে। তারপরে আপনি $ অপারেটর ব্যবহার করে এগুলি অ্যাক্সেস করতে পারবেনmyobject$componentname

LM বস্তুর ক্ষেত্রে, সেখানে পূর্বনির্ধারিত পদ্ধতি এক যেমন ব্যবহার করতে পারেন একটি নম্বর আছে 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

@ ভিনসেন্টের উত্তরের সম্প্রসারণ :

জন্য 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
আমি এই পদ্ধতিটি চেষ্টা করেছিলাম, তবে লিনিয়ার মডেলটিতে কোনও এনএ শর্তাদি থাকলে
j_v_wow_d

5

আমি এই lmp ফাংশনটি বেশ কয়েকবার ব্যবহার করেছি।

এবং এক পর্যায়ে আমি ডেটা বিশ্লেষণ বাড়ানোর জন্য নতুন বৈশিষ্ট্য যুক্ত করার সিদ্ধান্ত নিয়েছি। আমি আর বা পরিসংখ্যানগুলিতে বিশেষজ্ঞ নই তবে লোকেরা সাধারণত লিনিয়ার রিগ্রেশন সম্পর্কিত বিভিন্ন তথ্যের দিকে তাকাতে থাকে:

  • P-মান
  • ক এবং খ
  • এবং অবশ্যই পয়েন্ট বিতরণের দিক

একটি উদাহরণ দেওয়া যাক। তোমার এখানে আছে

বিভিন্ন ভেরিয়েবল সহ একটি পুনরুত্পাদনযোগ্য উদাহরণ:

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()থেকে গণনা করতে ব্যবহার করে usessummary(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 এর পরিবর্তে কর্টেস্টেস্ট ফাংশনটি ব্যবহার করা:

> 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সহগ ম্যাট্রিক্সের সারি বোঝায় এমন একটি সংখ্যা কোথায় আছে । এটি আপনার মডেলটিতে আপনার কতগুলি বৈশিষ্ট্য রয়েছে এবং কোনটির জন্য আপনি পি-মানটি বের করতে চান তার উপর নির্ভর করবে। উদাহরণস্বরূপ, আপনার যদি একটি মাত্র পরিবর্তনশীল থাকে তবে ইন্টারসেপ্টের জন্য একটি পি-মান থাকবে যা হবে [1,4] এবং পরেরটি আপনার আসল ভেরিয়েবলের জন্য হবে যা [2,4] হবে। সুতরাং আপনার numহবে 2।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.