R에서 두 다항식 회귀 분석의 차이의 통계적 유의성을 비교합니다.


10

우선이 포럼에서 몇 가지 조사를 해본 결과 매우 비슷한 질문에 대한 답변을 받았지만 일반적으로 제대로 답변되지 않았거나 때로는 답변이 상세하지 않은 경우가 있습니다. 그래서 이번에는 내 질문은 : 나는 두 개의 데이터 세트를 가지고 있는데, 각각에 대해 다항식 회귀를 수행합니다.

Ratio<-(mydata2[,c(2)])
Time_in_days<-(mydata2[,c(1)])
fit3IRC <- lm( Ratio~(poly(Time_in_days,2)) )

다항식 회귀 도표는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

계수는 다음과 같습니다.

> as.vector(coef(fit3CN))
[1] -0.9751726 -4.0876782  0.6860041
> as.vector(coef(fit3IRC))
[1] -1.1446297 -5.4449486  0.5883757 

그리고 이제 R 함수를 사용하여 테스트를 수행하는 방법이 있는지 알고 싶습니다. 두 다항식 회귀 분석의 차이에 통계적으로 유의한지 여부를 알려주는 일이 있습니다. 1,100].

내가 이해 한 바에 따르면 값은 모델 / 실제 데이터를 비교하는 데 사용되는 두 가지 다른 데이터 세트 또는 AIC에서 가져 오기 때문에 anova 테스트를 직접 적용 할 수 없습니다.

관련 질문에 @Roland가 제공 한 지침을 따르려고했지만 결과를 볼 때 뭔가 잘못 이해했을 수 있습니다.

여기 내가 한 일이 있습니다.

두 데이터 세트를 하나로 결합했습니다.

f@Roland가 이야기 한 변수입니다. 첫 번째 세트에는 1을, 다른 세트에는 0을 넣습니다.

y<-(mydata2[,c(2)])
x<-(mydata2[,c(1)])
f<-(mydata2[,c(3)])

plot(x,y, xlim=c(1,nrow(mydata2)),type='p')

fit3ANOVA <- lm( y~(poly(x,2)) )

fit3ANOVACN <- lm( y~f*(poly(x,2)) )

내 데이터는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

빨간색 fit3ANOVA은 여전히 ​​작동하지만 fit3ANOVACN모델에 이상한 결과가 있는 파란색에 문제가 있습니다. 맞는 모델이 올바른지 모르겠지만 @Roland가 정확히 무엇을 의미하는지 이해할 수 없습니다.

@DeltaIV 솔루션을 고려하면 그 경우 : 여기에 이미지 설명을 입력하십시오 모델이 겹치더라도 크게 다릅니다. 내가 그렇게 생각할 권리가 있습니까?


귀하가 연결하는 질문에 대한 사용자 @Roland의 의견이 귀하의 질문에 완벽하게 답변하는 것 같습니다. 정확히 이해하지 못하는 것은 무엇입니까?
DeltaIV

글쎄, 몇 가지 사항, 나는 이것이 의견 섹션에 있었기 때문에 이것이 올바른 대답인지 확실하지 않았지만, 그것이 작동한다면, 나는 이해해야합니다. 기본적으로 원래 데이터 세트에 따라 1과 0과 같은 열을 만드는 새 데이터 세트를 만들어야합니다. 그런 다음 모든 데이터로 하나의 데이터 집합 중 하나만 고려한 두 가지 모델을 만듭니다. 그런 다음 anova 테스트를 적용합니다. 그게 다야 ? 또한 나는 anova 테스트를 사용한 적이 없으며, 정확한 p- 값에 대해 정확히 이야기했습니다.
PaoloH

1
귀하의 경우 두 회귀는 같은 간격으로 있습니다. 선형 회귀에 대한 신뢰 구간을 해석하는 것이 가장 좋은 경우입니다. 이 경우 두 회귀 분석은 전체 구간 ( 에 걸쳐 서로의 신뢰 구간에 완전히 포함 된 경우 통계적으로 다르지 않습니다. [0,100]
DeltaIV

답변:


15
#Create some example data
mydata1 <- subset(iris, Species == "setosa", select = c(Sepal.Length, Sepal.Width))
mydata2 <- subset(iris, Species == "virginica", select = c(Sepal.Length, Sepal.Width))

#add a grouping variable
mydata1$g <- "a"
mydata2$g <- "b"

#combine the datasets
mydata <- rbind(mydata1, mydata2)

#model without grouping variable
fit0 <- lm(Sepal.Width ~ poly(Sepal.Length, 2), data = mydata)

#model with grouping variable
fit1 <- lm(Sepal.Width ~ poly(Sepal.Length, 2) * g, data = mydata)

#compare models 
anova(fit0, fit1)
#Analysis of Variance Table
#
#Model 1: Sepal.Width ~ poly(Sepal.Length, 2)
#Model 2: Sepal.Width ~ poly(Sepal.Length, 2) * g
#  Res.Df     RSS Df Sum of Sq      F    Pr(>F)    
#1     97 16.4700                                  
#2     94  7.1143  3    9.3557 41.205 < 2.2e-16 ***
#  ---
#  Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

fit1보다 시피, fit0그룹화 변수의 효과가 중요합니다. 그룹화 변수는 각각의 데이터 세트를 나타내므로 두 데이터 세트에 대한 다항식 피팅은 크게 다른 것으로 간주 될 수 있습니다.


죄송하지만 이것이 Anova 테스트 결과에 익숙하지 않습니다. fit1이 fit0보다 낫다는 것을 알려주는 것은 무엇입니까? Pr (> F)는 극도로 낮습니까?
PaoloH

1
p- 값은 모형이 유의하게 다른지 여부를 알려줍니다 (p- 값이 낮을수록 변동을 고려하여 "더 달라짐"을 의미 함). 일반적으로 p <0.05는 중요합니다. RSS가 작을수록 더 적합한 모형을 나타냅니다.
Roland

@PaoloH Btw.에서는 비율을 종속 변수로 사용하지 않아야합니다. 보통 최소 제곱 모델의 가정은 이러한 종속 변수를 보유하지 않습니다.
Roland

8

@Ronald의 답변이 최고이며 많은 유사한 문제에 광범위하게 적용됩니다 (예 : 체중과 연령의 관계에서 남성과 여성의 통계적으로 유의미한 차이가 있습니까?). 그러나 양적 ( p- 값을 제공하지는 않음)은 아니지만 그 차이를 그래픽으로 표시하는 다른 솔루션을 추가하겠습니다 .

편집 :에 따라 이 문제 , 그 모양 predict.lm에 의해 사용되는 함수 ggplot2신뢰 구간을 계산하기 위해 계산되지 않고 동시 신뢰 대역 회귀 곡선 주위 만 점별 신뢰 밴드. 이 마지막 대역은 두 개의 적합 선형 모델이 통계적으로 다른지 또는 동일한 실제 모델과 호환 될 수 있는지 여부에 대해 다른 방식으로 평가되는지를 판단하는 데 적합하지 않습니다. 따라서 귀하의 질문에 대답하기에 올바른 곡선이 아닙니다. 동시 신뢰 밴드 (이상한!)를 얻을 수있는 R 내장이 없기 때문에 필자는 자체 기능을 작성했습니다. 여기있어:

simultaneous_CBs <- function(linear_model, newdata, level = 0.95){
    # Working-Hotelling 1 – α confidence bands for the model linear_model
    # at points newdata with α = 1 - level

    # summary of regression model
    lm_summary <- summary(linear_model)
    # degrees of freedom 
    p <- lm_summary$df[1]
    # residual degrees of freedom
    nmp <-lm_summary$df[2]
    # F-distribution
    Fvalue <- qf(level,p,nmp)
    # multiplier
    W <- sqrt(p*Fvalue)
    # confidence intervals for the mean response at the new points
    CI <- predict(linear_model, newdata, se.fit = TRUE, interval = "confidence", 
                  level = level)
    # mean value at new points
    Y_h <- CI$fit[,1]
    # Working-Hotelling 1 – α confidence bands
    LB <- Y_h - W*CI$se.fit
    UB <- Y_h + W*CI$se.fit
    sim_CB <- data.frame(LowerBound = LB, Mean = Y_h, UpperBound = UB)
}

library(dplyr)
# sample datasets
setosa <- iris %>% filter(Species == "setosa") %>% select(Sepal.Length, Sepal.Width, Species)
virginica <- iris %>% filter(Species == "virginica") %>% select(Sepal.Length, Sepal.Width, Species)

# compute simultaneous confidence bands
# 1. compute linear models
Model <- as.formula(Sepal.Width ~ poly(Sepal.Length,2))
fit1  <- lm(Model, data = setosa)
fit2  <- lm(Model, data = virginica)
# 2. compute new prediction points
npoints <- 100
newdata1 <- with(setosa, data.frame(Sepal.Length = 
                                       seq(min(Sepal.Length), max(Sepal.Length), len = npoints )))
newdata2 <- with(virginica, data.frame(Sepal.Length = 
                                          seq(min(Sepal.Length), max(Sepal.Length), len = npoints)))
# 3. simultaneous confidence bands
mylevel = 0.95
cc1 <- simultaneous_CBs(fit1, newdata1, level = mylevel)
cc1 <- cc1 %>% mutate(Species = "setosa", Sepal.Length = newdata1$Sepal.Length)
cc2 <- simultaneous_CBs(fit2, newdata2, level = mylevel)
cc2 <- cc2 %>% mutate(Species = "virginica", Sepal.Length = newdata2$Sepal.Length)

# combine datasets
mydata <- rbind(setosa, virginica)
mycc   <- rbind(cc1, cc2)    
mycc   <- mycc %>% rename(Sepal.Width = Mean) 
# plot both simultaneous confidence bands and pointwise confidence
# bands, to show the difference
library(ggplot2)
# prepare a plot using dataframe mydata, mapping sepal Length to x,
# sepal width to y, and grouping the data by species
p <- ggplot(data = mydata, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
# add data points
geom_point() +
# add quadratic regression with orthogonal polynomials and 95% pointwise
# confidence intervals
geom_smooth(method ="lm", formula = y ~ poly(x,2)) +
# add 95% simultaneous confidence bands
geom_ribbon(data = mycc, aes(x = Sepal.Length, color = NULL, fill = Species, ymin = LowerBound, ymax = UpperBound),alpha = 0.5)
print(p)

여기에 이미지 설명을 입력하십시오

내부 밴드는 기본적으로 geom_smooth다음과 같이 계산됩니다 . 회귀 곡선 주변의 포인트 단위 95 % 신뢰 밴드입니다. 외부 반투명 밴드 (그래픽 팁 덕분에 @Roland)는 95 % 의 동시 신뢰 밴드입니다. 보시다시피 예상대로 포인트 단위보다 큽니다. 두 곡선의 동시 신뢰 구간이 겹치지 않는다는 사실은 두 모델 간의 차이가 통계적으로 유의하다는 사실을 나타내는 것으로 간주 할 수 있습니다.

물론 유효한 p- 값 을 사용한 가설 검정의 경우 @Roland 접근법을 따라야하지만이 그래픽 방식은 탐색 적 데이터 분석으로 볼 수 있습니다. 또한 줄거리는 우리에게 몇 가지 추가 아이디어를 줄 수 있습니다. 두 데이터 세트의 모델이 통계적으로 다르다는 것이 분명합니다. 그러나 2 차 1 모형이 2 차 모형뿐만 아니라 거의 데이터에 적합 할 것 같습니다. 이 가설을 쉽게 테스트 할 수 있습니다.

fit_deg1 <- lm(data = mydata, Sepal.Width ~ Species*poly(Sepal.Length,1))
fit_deg2 <- lm(data = mydata, Sepal.Width ~ Species*poly(Sepal.Length,2))
anova(fit_deg1, fit_deg2)
# Analysis of Variance Table

# Model 1: Sepal.Width ~ Species * poly(Sepal.Length, 1)
# Model 2: Sepal.Width ~ Species * poly(Sepal.Length, 2)
#  Res.Df    RSS Df Sum of Sq      F Pr(>F)
# 1     96 7.1895                           
# 2     94 7.1143  2  0.075221 0.4969   0.61

차수 1 모델과 차수 2 모델의 차이는 중요하지 않으므로 각 데이터 세트에 대해 두 개의 선형 회귀를 사용할 수도 있습니다.


3
플로팅 +1 통계 분석의 중요한 부분.
Roland

"두 곡선의 신뢰 구간이 겹치지 않는다는 사실은 두 모델 간의 차이가 통계적으로 유의하다는 사실을 나타내는 것으로 간주 할 수 있습니다." 그러나 차이점이 겹치면 그 차이가 중요하지 않다고 말할 수는 없습니까?
PaoloH

좀 더 구체적으로 게시물에 예제를 추가했습니다.
PaoloH

@PaoloH, 질문에 새 줄거리를 추가 했으므로 의견을 추가 할 것입니다.
DeltaIV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.