선형 회귀에서 p- 값과 r- 제곱을 빼십시오


179

간단한 선형 회귀 모형에서 p- 값 (단일 설명 변수의 계수가 0이 아님)과 R- 제곱 값을 어떻게 구합니까? 예를 들어 ...

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

p- 값과 R- 제곱 값 을 summary(fit) 표시 한다는 것을 알고 있지만 다른 변수에 넣을 수 있기를 원합니다.


출력을 객체에 할당하지 않은 경우에만 값을 표시합니다 (예 : r <- summary(lm(rnorm(10)~runif(10)))아무것도 표시하지 않음).
Joshua Ulrich

답변:


157

r- 제곱 : 요약 객체에서 r- 제곱 값을 직접 반환 할 수 있습니다 summary(fit)$r.squared. names(summary(fit))직접 추출 할 수있는 모든 항목의 목록을 참조하십시오 .

모형 p- 값 : 전체 회귀 모형의 p- 값을 얻으려는 경우이 블로그 게시물 에서는 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

예측 변수가 하나 인 단순 회귀 분석의 경우 계수 p에 대한 모형 p- 값과 p- 값이 같습니다.

계수 p- 값 : 예측 변수가 둘 이상인 경우 위의 모형 p- 값을 반환하고 계수에 대한 p- 값은 다음을 사용하여 추출 할 수 있습니다.

summary(fit)$coefficients[,4]  

또는 anova(fit)위의 요약 개체와 비슷한 방식으로 개체 의 계수 p- 값을 가져올 수 있습니다 .


13
직접 사용 inherits하는 것보다 사용하는 것이 좋습니다 class. 그리고 어쩌면 당신은 unname(pf(f[1],f[2],f[3],lower.tail=F))원합니까?
hadley

150

summary(fit)필요한 모든 정보 가 포함 된 개체 를 생성합니다. 베타, se, t 및 p 벡터가 저장됩니다. 계수 행렬의 4 번째 열 (요약 객체에 저장 됨)을 선택하여 p- 값을 가져옵니다.

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

보십시오 str(summary(fit))이 객체가 포함 된 모든 정보를 볼 수 있습니다.

편집 : 기본적으로 내가 여기에주는 것에 도달하는 방법을 알려주는 체이스의 대답을 잘못 읽었습니다.


11
참고 : 이것은 다른 예측 변수뿐만 아니라 절편의 p- 값에 쉽게 액세스 할 수있는 유일한 방법입니다. 지금까지 최고입니다.
Daniel Egan

2
이것이 정답입니다. 최상위 답변은 저에게 효과적이지 않았습니다.
Chris

8
P- 값에 쉽게 액세스하려면이 답변을 사용하십시오. 요약 출력 자체에서 p- 값을 찾기가 조금 더 어려워 야하는 경우 여러 줄 함수를 작성하거나 새 객체 (예 : anova 출력)를 작성해야하는 이유는 무엇입니까? 개인 p- 값 자체를 분리하려면 빈센트의 대답에 행 번호를 추가 할 것 : 예를 들어, summary(fit)$coefficients[1,4] 파묻혀 ntercept을 위해
theforestecologist

2
참고 :이 방법은 모델을 사용하여 만든 모델 lm()에는 작동하지만 gls()모델 에는 작동하지 않습니다 .
theforestecologist

3
체이스의 답은 모형의 p- 값을 반환하고이 답은 계수의 p- 값을 반환합니다. 단순한 회귀 분석의 경우에는 동일하지만 예측 변수가 여러 개인 모델의 경우 동일하지 않습니다. 따라서 두 답변 모두 추출하려는 대상에 따라 유용합니다.
Jeromy Anglim

44

summary()를 호출하여 반환 된 객체의 구조를 볼 수 있습니다 str(summary(fit)). 각 부분은을 사용하여 액세스 할 수 있습니다 $. F 통계량의 p- 값은에서 반환 한 객체에서 더 쉽게 얻을 수 있습니다 anova.

간결하게, 당신은 이것을 할 수 있습니다 :

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

10
이것은 회귀의
pval

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"

이것은 좋은 답변입니다!
Andrew Brēza

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

개별 p- 값 자체를 분리하려면 코드에 행 번호를 추가하십시오.

예를 들어 두 모델 요약에서 절편의 p- 값에 액세스하려면 다음을 수행하십시오.

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

이것이 p- 값을 얻는 가장 쉬운 방법입니다.

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

1
이 방법을 시도했지만 선형 모형에 NA 항이 포함되어 있으면 실패합니다.
j_v_wow_d

5

이 lmp 함수를 꽤 많이 사용했습니다.

그리고 어느 시점에서 데이터 분석을 향상시키기 위해 새로운 기능을 추가하기로 결정했습니다. 나는 R 또는 통계 전문가가 아니지만 사람들은 일반적으로 선형 회귀에 대한 다른 정보를보고 있습니다.

  • p- 값
  • a와 b
  • 물론 점 분포의 측면

예를 들어 봅시다. 당신은 여기에 있습니다

다른 변수를 가진 재현 가능한 예는 다음과 같습니다.

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

끝에 표시되는 최종 p- 값의 경우이 summary()함수는 값 pf()을 계산하는 데 사용 summary(fit)$fstatistic합니다.

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

출처 : [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
이 코드가 왜 작동하는지 간략하게 설명 할 수 있습니까?
aribeiro

기존 답변 (특히 허용되는 답변)이 어떻게 향상됩니까?
Ben Bolker

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] 인 절편에 대한 p- 값 하나와 실제 변수에 대한 [2,4]에 대한 다음 p- 값이 있습니다. 그래서 당신 num은 2가 될 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.