두 개 이상의 회귀 모형에서 기울기를 비교하기 위해 어떤 테스트를 사용할 수 있습니까?


29

하나의 예측 변수에 대한 두 변수의 응답 차이를 테스트하고 싶습니다. 최소한의 재현 가능한 예는 다음과 같습니다.

library(nlme) 
## gls is used in the application; lm would suffice for this example
m.set <- gls(Sepal.Length ~ Petal.Width, data = iris, 
               subset = Species == "setosa")
m.vir <- gls(Sepal.Length ~ Petal.Width, data = iris, 
               subset = Species == "virginica")
m.ver <- gls(Sepal.Length ~ Petal.Width, data = iris, 
               subset = Species == "versicolor")

경사 계수가 다르다는 것을 알 수 있습니다.

m.set$coefficients
(Intercept) Petal.Width 
  4.7771775   0.9301727
m.vir$coefficients
(Intercept) Petal.Width 
  5.2694172   0.6508306 
m.ver$coefficients
(Intercept) Petal.Width 
   4.044640    1.426365 

세 가지 질문이 있습니다.

  1. 경사면의 차이를 어떻게 테스트 할 수 있습니까?
  2. 잔차 분산의 차이를 어떻게 검정 할 수 있습니까?
  3. 이러한 비교를 제시하는 간단하고 효과적인 방법은 무엇입니까?

관련 질문 인 두 회귀 모델에서 변수 계수를 비교하는 방법 은 기울기를 구분하기 위해 더미 변수로 모델을 다시 실행하는 것을 제안합니다. 독립 데이터 세트를 사용할 수있는 옵션이 있습니까?


첫 번째 질문에 대해서는 stats.stackexchange.com/questions/55501/…를 참조하십시오 .
russellpierce

답변:


22

경사면의 차이를 어떻게 테스트 할 수 있습니까?

종에 대한 더미를 포함시키고 와 상호 작용하도록 하고이 더미가 중요한지 확인하십시오. 하자 꽃받침 길이와 페달 폭하고 세 종족에 대한 더미 변수합니다. 모델 비교PiLiPiS1,S2,S3

E(Li)=β0+β1Pi

의 효과가 각 종마다 다를 수있는 모델을 사용합니다 .Pi

E(Li)=α0+α1S2+α2S3+α4Pi+α5PiS2+α6PiS3

GLS 추정치는 MLE이고 첫 번째 모델은 두 번째 모델의 하위 모델이므로 여기에서 우도 비율 검정을 사용할 수 있습니다. logLik함수를 사용하여 가능성을 추출 할 수 있으며 하위 모형에 도달하기 위해 매개 변수를 삭제 했으므로 검정의 자유도는 가됩니다 .44

비교를 제시하는 간단하고 효과적인 방법은 무엇입니까?

가장 매력적인 방법은 각 종의 회귀선을 모두 같은 축에, 아마도 표준 오차를 기반으로 한 오차 막대를 사용하여 플롯하는 것입니다. 이것은 종과 와의 관계 간의 차이 (또는 비 차이)를 매우 분명하게 만듭니다.Pi

편집 : 다른 질문이 본문에 추가 된 것으로 나타났습니다. 그래서 나는 그것에 대한 답변을 추가하고 있습니다 :

잔차 분산의 차이를 어떻게 검정 할 수 있습니까?

이를 위해 데이터 세트를 계층화하고 별도의 모델에 적합해야합니다. 제안한 교호 작용 기반 모델은 잔차 분산이 모든 그룹에서 동일하도록 제한 할 것이기 때문입니다. 별도의 모델에 적합하면이 구속 조건이 사라집니다. 이 경우에도 우도 비 검정을 사용할 수 있습니다 (더 큰 모형의 우도는 이제 세 개의 개별 모형에서 우도를 합하여 계산됩니다). "널 (null)"모델은 비교하려는 대상에 따라 다릅니다.

  • 당신이 경우 에만 의 주요 효과를 유지하면서, 분산을 테스트하려면, 다음 "널 (null)"모델은 제가 위에서 작성한 상호 작용 모델이어야한다. 검정의 자유도는 입니다.2

  • 계수와 함께 분산을 테스트하려면 null 모델이 위에서 작성한 첫 번째 모델이어야합니다. 검정의 자유도는 입니다.6


두 번째 모델에 이없는 이유는 무엇 입니까? 가 R에서 모델의 올바른 구현은? S1gls(Sepal.Length ~ species:Petal.Width, data = iris)
Abe

안녕하세요 @Abe. 은 "참조"종입니다. 해당 종의 회귀선은 됩니다. 경우 범주 형 변수 나는 생각 구문이 될 것입니다. α 0 + α (4) P의 S1α0+α4Pispeciesgls(Sepal.Length ~ species*Petal.Width, data=iris)
매크로

@ 매크로 니스 답변 (+1)! gls모델을 맞출 수는 있지만 옵션으로 각 종에 대해 다른 잔차 분산을 허용 하는지 궁금합니다 weights=varIdent(form=~1|Species)(두 번째 질문과 관련하여)?
COOLSerdash

15

R 코드를 사용하여 이러한 질문에 대답하려면 다음을 사용하십시오.
1. 경사도의 차이를 어떻게 테스트 할 수 있습니까?
답 : Petal.Width by Species의 상호 작용에서 ANOVA p- 값을 조사한 후 lsmeans :: lstrends를 사용하여 다음과 같이 기울기를 비교하십시오.

library(lsmeans)
m.interaction <- lm(Sepal.Length ~ Petal.Width*Species, data = iris)
anova(m.interaction)
 Analysis of Variance Table

 Response: Sepal.Length
                      Df Sum Sq Mean Sq  F value Pr(>F)    
 Petal.Width           1 68.353  68.353 298.0784 <2e-16 ***
 Species               2  0.035   0.017   0.0754 0.9274    
 Petal.Width:Species   2  0.759   0.380   1.6552 0.1947    
 Residuals           144 33.021   0.229                    
 ---
 Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

# Obtain slopes
m.interaction$coefficients
m.lst <- lstrends(m.interaction, "Species", var="Petal.Width")
 Species    Petal.Width.trend        SE  df   lower.CL upper.CL
 setosa             0.9301727 0.6491360 144 -0.3528933 2.213239
 versicolor         1.4263647 0.3459350 144  0.7425981 2.110131
 virginica          0.6508306 0.2490791 144  0.1585071 1.143154

# Compare slopes
pairs(m.lst)
 contrast                 estimate        SE  df t.ratio p.value
 setosa - versicolor    -0.4961919 0.7355601 144  -0.675  0.7786
 setosa - virginica      0.2793421 0.6952826 144   0.402  0.9149
 versicolor - virginica  0.7755341 0.4262762 144   1.819  0.1669

2. 잔차 분산의 차이를 어떻게 테스트 할 수 있습니까?
이 질문을 이해하면 다음과 같이 피어슨 상관 관계를 "피셔의 r-to-z"라고도하는 Fisher 변환과 비교할 수 있습니다.

library(psych)
library(data.table)
iris <- as.data.table(iris)
# Calculate Pearson's R
m.correlations <- iris[, cor(Sepal.Length, Petal.Width), by = Species]
m.correlations
# Compare R values with Fisher's R to Z
paired.r(m.correlations[Species=="setosa", V1], m.correlations[Species=="versicolor", V1], 
         n = iris[Species %in% c("setosa", "versicolor"), .N])
paired.r(m.correlations[Species=="setosa", V1], m.correlations[Species=="virginica", V1], 
         n = iris[Species %in% c("setosa", "virginica"), .N])
paired.r(m.correlations[Species=="virginica", V1], m.correlations[Species=="versicolor", V1], 
         n = iris[Species %in% c("virginica", "versicolor"), .N])

3. 이러한 비교를 제시하는 간단하고 효과적인 방법은 무엇입니까?
"각 종에 대한 Sepal Length와 Petal Width의 관계를 비교하기 위해 선형 회귀를 사용했습니다. 우리는 I. Setosa에 대한 Sepal Length와 Petal Width의 관계에서 유의 한 상호 작용을 찾지 못했습니다 . Setosa (B = 0.9), I. Versicolor (B = 1.4) 또는 I. Virginica (B = 0.6); F (2, 144) = 1.6, p = 0.19 피셔의 r-to-z 비교는 I. Setosa에 대한 피어슨 상관 관계 (r = 0.28)는 I. Versicolor (r = 0.55 )보다 유의하게 낮음 (p = 0.02) 마찬가지로 I. Virginica (r = 0.28) 의 상관 관계 는 I. Versicolor에서 관찰 된 것보다 유의하게 약합니다 (p = 0.02) ."

마지막으로 항상 결과를 시각화하십시오!

plotly_interaction <- function(data, x, y, category, colors = col2rgb(viridis(nlevels(as.factor(data[[category]])))), ...) {
  # Create Plotly scatter plot of x vs y, with separate lines for each level of the categorical variable. 
  # In other words, create an interaction scatter plot.
  # The "colors" must be supplied in a RGB triplet, as produced by col2rgb().

  require(plotly)
  require(viridis)
  require(broom)

  groups <- unique(data[[category]])

  p <- plot_ly(...)

  for (i in 1:length(groups)) {
    groupData = data[which(data[[category]]==groups[[i]]), ]
    p <- add_lines(p, data = groupData,
                   y = fitted(lm(data = groupData, groupData[[y]] ~ groupData[[x]])),
                   x = groupData[[x]],
                   line = list(color = paste('rgb', '(', paste(colors[, i], collapse = ", "), ')')),
                   name = groups[[i]],
                   showlegend = FALSE)
    p <- add_ribbons(p, data = augment(lm(data = groupData, groupData[[y]] ~ groupData[[x]])),
                     y = groupData[[y]],
                     x = groupData[[x]],
                     ymin = ~.fitted - 1.96 * .se.fit,
                     ymax = ~.fitted + 1.96 * .se.fit,
                     line = list(color = paste('rgba','(', paste(colors[, i], collapse = ", "), ', 0.05)')), 
                     fillcolor = paste('rgba', '(', paste(colors[, i], collapse = ", "), ', 0.1)'),
                     showlegend = FALSE)
    p <- add_markers(p, data = groupData, 
                     x = groupData[[x]], 
                     y = groupData[[y]],
                     symbol = groupData[[category]],
                     marker = list(color=paste('rgb','(', paste(colors[, i], collapse = ", "))))
  }
  p <- layout(p, xaxis = list(title = x), yaxis = list(title = y))
  return(p)
}

plotly_interaction(iris, "Sepal.Length", "Petal.Width", "Species")

irisPlot


8

이전 제안에 동의합니다. 각 데이터 세트에 더미 변수가있는 다중 회귀 모형을 적합해야합니다. 인터셉트가 다른지 테스트 할 수 있습니다. 경사가 다른지 알고 싶다면 더미와 해당 변수 사이의 상호 작용도 포함해야합니다. 데이터가 독립적이라는 사실에는 문제가 없습니다. 만약 그들이주의 모두 독립 다른 종 (예를 들어), 당신은 그들이 완벽하게 혼동 한, 당신은 찾을 수의 차이로 인해 서로 다른 종 또는 다른 데이터 세트에 있는지 여부를 알 수 없을 것입니다. 그러나 테스트없습니다 새로운 샘플을 모으고 연구를 다시 실행하지 않고도 문제를 해결해 줄 수있는 감옥에서 나옵니다.


거의 동시에 거의 비슷한 답변을 게시 한 것 같습니다. +1
매크로

@ 매크로, 그렇습니다. 그러나 당신의 것이 대부분 더 좋습니다 (+1 이전). 질문을 처음 읽었을 때 놓친 3 가지 질문을 모두 해결했습니다. 여기 내 공헌은 혼란에 대한 부분입니다.
gung-Monica Monica 복원

예, 좋은 지적입니다. 나는 당신 이이 질문을한다면 데이터 세트가 같은 것을 측정하고 있다는 가정하에 작동해야한다고 가정합니다. 유일한 차이점은 종이 다르다는 것입니다.
매크로

3
내 생각에서 당신은 둘 다 내가 뭘하고 있는지 공감해야합니다.
Michael R. Chernick

1
더미 변수 제안은 모델마다 오차 분산이 눈에 띄게 다르지 않으면 좋습니다. 그렇지 않으면 Satterthwaite-Welch t-test (발행 된 논문을 읽을 때와 같이 요약 통계 만 알려진 경우에 사용 가능한 이점이 있음)를 적용하거나 가중 최소 제곱을 사용하여 결합 된 모델에 맞출 수 있습니다.
whuber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.