回答:
明らかなものが足りないのではないかと思いますが、統計的にANCOVAを使用してこれを行うことはできませんか?重要な問題は、2つの回帰の勾配が誤差を伴って推定されることです。これらは、母集団全体の勾配の推定値です。2つの回帰直線が母集団内で平行かどうかが懸念事項である場合、正確な等価性についてと直接比較することは意味がありません。これらは両方とも、考慮に入れる必要のあるエラー/不確実性の影響を受けます。
これを統計的な観点から考え、両方のデータセットのとに関するデータを何らかの意味のある方法で組み合わせることができる場合(つまり、両方のセットのとは、2つの母集団から2つの母集団から描画されます変数は、2つの母集団で異なるのは、それらの間の関係にすぎません)。次の2つのモデルを近似できます。
そして
ここで、はモデル係数、はグループ化変数/係数で、各観測がどのデータセットに属するかを示します。
分散分析表またはF比を使用して、2番目のより複雑なモデルが、より単純なモデルよりもデータに適しているかどうかをテストできます。より単純なモデルでは、2つの線の傾きは同じ()ですが、線は互いにだけオフセットされています。
より複雑なモデルには、線の傾きとグループ化変数間の相互作用が含まれます。この相互作用項の係数がゼロと大幅に異なる場合、または分散分析/ F比がより複雑なモデルがデータに適していることを示す場合、2つの線が平行であるというNull仮説を棄却する必要があります。
Rでダミーデータを使用した例を次に示します。最初に、勾配が等しいデータ:
set.seed(2)
samp <- factor(sample(rep(c("A","B"), each = 50)))
d1 <- data.frame(y = c(2,5)[as.numeric(samp)] + (0.5 * (1:100)) + rnorm(100),
x = 1:100,
g = samp)
m1 <- lm(y ~ x * g, data = d1)
m1.null <- lm(y ~ x + g, data = d1)
anova(m1.null, m1)
与える
> anova(m1.null, m1)
Analysis of Variance Table
Model 1: y ~ x + g
Model 2: y ~ x * g
Res.Df RSS Df Sum of Sq F Pr(>F)
1 97 122.29
2 96 122.13 1 0.15918 0.1251 0.7243
このデータサンプルでは、勾配が等しいという帰無仮説を棄却できないことを示しています。もちろん、実際に差異があったとしても、差異を検出するのに十分な能力があり、サンプルサイズが小さすぎて予期した効果が得られなかったために誤ってnullを拒否できなかったことを確認したいと思います。
現在、さまざまなスロープがあります。
set.seed(42)
x <- seq(1, 100, by = 2)
d2 <- data.frame(y = c(2 + (0.5 * x) + rnorm(50),
5 + (1.5 * x) + rnorm(50)),
x = x,
g = rep(c("A","B"), each = 50))
m2 <- lm(y ~ x * g, data = d2)
m2.null <- lm(y ~ x + g, data = d2)
anova(m2.null, m2)
それは与える:
> anova(m2.null, m2)
Analysis of Variance Table
Model 1: y ~ x + g
Model 2: y ~ x * g
Res.Df RSS Df Sum of Sq F Pr(>F)
1 97 21132.0
2 96 103.8 1 21028 19439 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
ここでは、帰無仮説に対する実質的な証拠があるので、対立仮説を支持してそれを棄却できます(つまり、2つの線の勾配が等しいという仮説を棄却します)。
私が適合させた2つのモデル()の相互作用項は、2 つのグループの勾配の推定差を示します。最初のモデルの場合、勾配の差の推定値は小さい(約0.003)
> coef(m1)
(Intercept) x gB x:gB
2.100068977 0.500596394 2.659509181 0.002846393
そして、これに対するは、勾配のこの差が0であるという帰無仮説を棄却できません。
> summary(m1)
Call:
lm(formula = y ~ x * g, data = d1)
Residuals:
Min 1Q Median 3Q Max
-2.32886 -0.81224 -0.01569 0.93010 2.29984
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.100069 0.334669 6.275 1.01e-08 ***
x 0.500596 0.005256 95.249 < 2e-16 ***
gB 2.659509 0.461191 5.767 9.82e-08 ***
x:gB 0.002846 0.008047 0.354 0.724
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.128 on 96 degrees of freedom
Multiple R-squared: 0.9941, Adjusted R-squared: 0.9939
F-statistic: 5347 on 3 and 96 DF, p-value: < 2.2e-16
2つのグループの勾配を異なるようにした2番目のデータセットに適合したモデルに目を向けると、2つの線の勾配の推定差は〜1単位であることがわかります。
> coef(m2)
(Intercept) x gB x:gB
2.3627432 0.4920317 2.8931074 1.0048653
グループ "A"の勾配は〜0.49(x
上記の出力)ですが、グループ "B"の勾配を取得するには、グループ "A"の勾配に差分勾配(相互作用項を思い出してください)を追加する必要があります。 ; 〜0.49 +〜1 =〜1.49。これは、グループ「B」の1.5の勾配にかなり近いです。斜面のこの差に対する検定はまた、差の推定値が0から離れて制限されることを示しています。
> summary(m2)
Call:
lm(formula = y ~ x * g, data = d2)
Residuals:
Min 1Q Median 3Q Max
-3.1962 -0.5389 0.0373 0.6952 2.1072
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.362743 0.294220 8.031 2.45e-12 ***
x 0.492032 0.005096 96.547 < 2e-16 ***
gB 2.893107 0.416090 6.953 4.33e-10 ***
x:gB 1.004865 0.007207 139.424 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.04 on 96 degrees of freedom
Multiple R-squared: 0.9994, Adjusted R-squared: 0.9994
F-statistic: 5.362e+04 on 3 and 96 DF, p-value: < 2.2e-16
最初の質問は、実際にはジオメトリからです。フォームに2行ある場合:
atan
サンプルRコード:
> x<-rnorm(100)
> y<-x+1+rnorm(100)/2
> mod<-lm(y~x)
> mod$coef
(Intercept) x
0.9416175 0.9850303
> mod$coef[2]
x
0.9850303
> atan(mod$coef[2])*360/2/pi
x
44.56792
最後の行は度です。
注意。高校の三角法を思い出すのは楽しいことでしたが、本当に役立つ答えはGavin Simpsonからのものです。回帰直線の傾きは確率変数であるため、それらを比較するには統計的仮説フレームワークを使用する必要があります。
... @mpiktasの回答に続き、lm
オブジェクトから勾配を抽出して上記の式を適用する方法を次に示します。
# prepare some data, see ?lm
ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2,10,20, labels=c("Ctl","Trt"))
weight <- c(ctl, trt)
lm.D9 <- lm(weight ~ group)
# extract the slope (this is also used to draw a regression line if you wrote abline(lm.D9)
coefficients(lm.D9)["groupTrt"]
groupTrt
-0.371
# use the arctan*a1 / (360 / (2*pi)) formula provided by mpiktas
atan(coefficients(lm.D9)["groupTrt"]) * (360/(2 * pi))
groupTrt
-20.35485
180-atan(coefficients(lm.D9)["groupTrt"]) * (360/(2 * pi))
groupTrt
200.3549