2つ以上の回帰モデルの勾配を比較するために使用できるテストは何ですか?


29

1つの予測子に対する2つの変数の応答の違いをテストしたいと思います。最小限の再現可能な例を次に示します。

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 

3つの質問があります。

  1. 勾配の違いをテストするにはどうすればよいですか?
  2. 残差分散の差をテストするにはどうすればよいですか?
  3. これらの比較を表示する簡単で効果的な方法は何ですか?

関連する質問「2つの回帰モデルの変数係数を比較する方法」では、ダミー変数を使用してモデルを再実行して勾配を区別することを提案していますが、独立したデータセットを使用できるオプションはありますか?


最初の質問に関してはstats.stackexchange.com/questions/55501/…をご覧ください。
ラッセルピアス14

回答:


22

勾配の違いをテストするにはどうすればよいですか?

種のダミーを含め、と対話させ、このダミーが重要かどうかを確認します。ましょLはiは、萼片の長さとすることP iは、ペダルの幅とすることS 1S 2S 3は、 3種のためのダミー変数です。モデルを比較するPiLiPiS1,S2,S3

EL=β0+β1P

の効果が種ごとに異なることを可能にするモデルで:P

EL=α0+α1S2+α2S3+α4P+α5PS2+α6PS3

logLik44

比較を表示する簡単で効果的な方法は何ですか?

P

編集:別の質問が本文に追加されていることに気付きました。だから、私はそれに答えを追加しています:

残差分散の差をテストするにはどうすればよいですか?

このため、データセットを階層化し、個別のモデルに適合させる必要があります。なぜなら、私が提案した相互作用ベースのモデルは、残差分散がすべてのグループで同じになるように制約するためです。別々のモデルに適合させると、この制約はなくなります。その場合でも、尤度比検定を使用できます(3つの別個のモデルの尤度を合計することで、より大きなモデルの尤度が計算されるようになりました)。「null」モデルは、比較する対象によって異なります

  • 2

  • 6


S1gls(Sepal.Length ~ species:Petal.Width, data = iris)

S1α0+α4Pspeciesgls(Sepal.Length ~ species*Petal.Width, data=iris)

@Macroいい答え(+1)!(2番目の質問に関して)glsオプションを使用して、各種の異なる残差分散を考慮しながら、モデルを近似できるかどうか疑問に思いますweights=varIdent(form=~1|Species)か?
COOLSerdash

15

Rコードでこれらの質問に答えるには、以下を使用します
。1.勾配の違いをテストするにはどうすればよいですか?
回答:種ごとのPetal.Widthの相互作用から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」とも呼ばれる)を次のように比較できます。

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.これらの比較を表示する簡単で効果的な方法は何ですか?
「我々はのための花びら幅にがく片の長さの関係で有意な相互作用見つけることができませんでした。それぞれの種のための花びら幅にがく片の長さの関係を比較するために、線形回帰を使用I. Setosa(B = 0.9)、I.カワラタケ(B = 1.4)、I。Virginica(B = 0.6); F(2、144)= 1.6、p = 0.19。Fisherのr対z比較では、I。Setosa(r = 0.28)のPearson相関が有意に低かった(p = 0.02)I.ベルシカラー(R = 0.55)。同様の相関I. virginicaのために観察されたものよりも(R = 0.28)が有意に弱かった(P = 0.02)I.ベルシカラー

最後に、常に結果を視覚化します!

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
マクロ

@Macro、はい、しかしあなたの方が大抵良いです(先に+1)。質問の最初の(完全ではない)読みで見落とした3つの質問すべてに回答しました。ここでの私の貢献は、交絡に関する部分です。
GUNG -復活モニカ

はい、それは良い点です。この問い合わせを行う場合、データセットが同じものなどを測定しているという仮定の下で操作する必要がありますが、唯一の違いは種が異なるということです。
マクロ

3
私の考え方から、あなたは両方とも私がやっていることである賛成を得なければなりません。
マイケルR.チャーニック

1
ダミー変数の提案は、モデル間で誤差の分散に大きな違いがない場合に適しています。 それ以外の場合は、Satterthwaite-Welch t検定(公開された論文を読む場合によくあるように、要約統計量のみがわかっている場合に利用できるという特異な利点があります)を適用するか、重み付き最小二乗を使用して結合モデルに適合させることができます。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.