Come calcolare la differenza di due pendenze?


11

Esiste un metodo per capire se due linee sono (più o meno) parallele? Ho due linee generate da regressioni lineari e vorrei capire se sono parallele. In altre parole, vorrei ottenere le diverse pendenze di queste due linee.

Esiste una funzione R per calcolare questo?

EDIT: ... e come posso ottenere la pendenza (in gradi) di una linea di regressione lineare?

Risposte:


23

Mi chiedo se mi manca qualcosa di ovvio, ma non potresti farlo statisticamente usando ANCOVA? Un problema importante è che le pendenze nelle due regressioni sono stimate con errori. Sono stime delle pendenze delle popolazioni in generale. Se la preoccupazione è se le due linee di regressione sono parallele o meno nella popolazione, allora non ha senso confrontare direttamente con per l'equivalenza esatta; sono entrambi soggetti a errori / incertezze che devono essere presi in considerazione.a 2un'1un'2

Se pensiamo a questo da un punto di vista statistico, e possiamo unire i dati ed per entrambi i set di dati in qualche modo significativo (cioè ed in entrambi i gruppi sono tratti dalle due popolazioni con intervalli simili per i due variabili è solo la relazione tra loro che è diversa nelle due popolazioni), quindi possiamo adattare i seguenti due modelli:y x yXyXy

y^=B0+B1X+B2g

e

y^=b0+b1X+B2g+B3Xg

Dove sono i coefficienti del modello e è una variabile / fattore di raggruppamento, che indica a quale set di dati appartiene ciascuna osservazione. gBiog

Possiamo utilizzare una tabella ANOVA o un rapporto F per verificare se il secondo modello più complesso si adatta meglio ai dati rispetto al modello più semplice. Il modello più semplice afferma che le pendenze delle due linee sono uguali ( ) ma le linee sono sfalsate l'una dall'altra di un importo .b 2B1B2

Il modello più complesso include un'interazione tra la pendenza della linea e la variabile di raggruppamento. Se il coefficiente per questo termine di interazione è significativamente diverso da zero o il rapporto ANOVA / F indica che il modello più complesso si adatta meglio ai dati, allora dobbiamo respingere l'ipotesi Null che le due linee siano parallele.

Ecco un esempio in R con dati fittizi. Innanzitutto, i dati con pendenze uguali:

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)

Che dà

> 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

Indica che non riusciamo a respingere l'ipotesi nulla di pendenze uguali in questo campione di dati. Ovviamente, vorremmo assicurarci che avessimo il potere sufficiente per rilevare una differenza se ce n'era davvero una, in modo tale da non indurre erroneamente a rifiutare il valore nullo perché la dimensione del nostro campione era troppo piccola per l'effetto previsto.

Ora con diverse piste.

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)

Che dà:

> 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

Qui abbiamo prove sostanziali contro l'ipotesi nulla e quindi possiamo rifiutarla a favore dell'alternativa (in altre parole, rifiutiamo l'ipotesi che le pendenze delle due linee siano uguali).

I termini di interazione nei due modelli che ho montato ( ) forniscono la differenza stimata nelle pendenze per i due gruppi. Per il primo modello, la stima della differenza nelle pendenze è piccola (~ 0,003)b3xg

> coef(m1)
(Intercept)           x          gB        x:gB 
2.100068977 0.500596394 2.659509181 0.002846393

e un -test su ciò non rifiutare l'ipotesi nulla che questa differenza di piste è 0:t

> 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 

Se passiamo al modello adattato al secondo set di dati, in cui abbiamo differenziato le pendenze per i due gruppi, vediamo che la differenza stimata nelle pendenze delle due linee è ~ 1 unità.

> coef(m2)
(Intercept)           x          gB        x:gB 
  2.3627432   0.4920317   2.8931074   1.0048653 

La pendenza per il gruppo "A" è ~ 0,49 ( xnell'output di cui sopra), mentre per ottenere la pendenza per il gruppo "B" è necessario aggiungere le pendenze di differenza (dare dal termine di interazione ricordare) alla pendenza del gruppo "A" ; ~ 0.49 + ~ 1 = ~ 1.49. Questo è abbastanza vicino alla pendenza dichiarata per il gruppo "B" di 1,5. Un test su questa differenza di pendenze indica anche che la stima della differenza è limitata da 0:t

> 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

grazie mille per questa ottima spiegazione. Il mio obiettivo è capire se lo sloper è più o meno lo stesso, quindi penso che userò ANOVA per testarlo.
Dail

se ho due vettori distintivi e vorrei confrontare i loro slop ma non ho y (lm (x ~ y), come posso usare ANOVA? Ho provato anova (lm (x ~ 1), lm (y ~ 1)) ma ricevo un avviso
Dail

Cosa intendi per vettori qui? In senso R o in senso matematico? Questo è molto diverso da quello che si domanda poste, quindi per favore iniziare una nuova domanda - non non modificare questo - è impossibile condurre follow-up di così ampio una natura nei commenti.
Gavin Simpson,

no aspetta, devo confrontare due modelli con ANOVA ... ok, ma se creo un modello con questa formula: x ~ 1 e un altro modello con y ~ 1 ricevo l'avvertimento. Sto parlando in senso R. Come posso fare?
Dail

1
@Dail se sono state montate due regressioni per ottenere due pendenze / linee, si hanno dati xey per entrambi i set di dati. Come ho detto nella mia risposta, se xs e ys sono comparabili nei due set di dati, allora puoi semplicemente combinare tutti i dati e aggiungere una variabile di raggruppamento. Il mio esempio mostra come farlo usando dati fittizi, ma hai già dati xey, sono i dati che hai usato per adattarsi alle regressioni separate.
Gavin Simpson,

8

La prima domanda è in realtà dalla geometria. Se hai due righe del modulo:

y=un'1X+B1
y=un'2X+B2

un'1=un'2

abbronzaturaα=un'1αXun'1

α=arctanun'1

2π=360

α=arctanun'13602π.

arctanatan

Codice R di esempio:

> 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 

L'ultima riga è i gradi.

un'1

α=180-arctanun'13602π.

Nota. Mentre è stato divertente per me ricordare la trigonometria del liceo, la risposta davvero utile è quella data da Gavin Simpson. Poiché le pendenze delle linee di regressione sono variabili casuali, per confrontarle è necessario utilizzare un quadro di ipotesi statistiche.


grazie! come ottenere la pendenza dalla regressione? devo ottenere coefficiente e intercettare?
Dail

forse la regressione lineare restituisce i gradi direttamente con qualche funzione?
Dail

dicendo degress = +45 e degress = -315 non sono la stessa riga? whare non sta parlando della stessa linea?
Dail

1

... seguendo la risposta di @mpiktas, ecco come estrarre la pendenza da un lmoggetto e applicare la formula sopra.

# 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 

grazie mille per l'esempio, in questo caso i gradi sono -200?
Dail

Sì. Se ritieni che il tuo problema sia stato risolto, spunta la risposta di @mpiktas come corretta, grazie.
Roman Luštrik,

2π

1
@ RomanLuštrik, ho corretto il codice e aggiunto l'output corretto. Sentiti libero di rimuovere la correzione.
mpiktas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.