Como calcular a diferença de duas pistas?


11

Existe um método para entender se duas linhas são (mais ou menos) paralelas? Eu tenho duas linhas geradas a partir de regressões lineares e gostaria de entender se elas são paralelas. Em outras palavras, eu gostaria de obter as diferentes inclinações dessas duas linhas.

Existe uma função R para calcular isso?

EDIT: ... e como posso obter a inclinação (em graus) de uma linha de regressão linear?

Respostas:


23

Gostaria de saber se estou perdendo algo óbvio, mas você não poderia fazer isso estatisticamente usando ANCOVA? Uma questão importante é que as inclinações nas duas regressões são estimadas com erro. São estimativas das inclinações nas populações em geral. Se a preocupação é se as duas linhas de regressão são paralelas ou não na população , não faz sentido comparar uma1 1 com uma2 diretamente para obter a equivalência exata; ambos estão sujeitos a erros / incertezas que precisam ser levados em consideração.

Se pensamos sobre este a partir de um ponto de vista estatístico, e podemos combinar os dados sobre a e y para os dois conjuntos de dados em alguma maneira significativa (isto é, x e y em ambos os conjuntos são retirados das duas populações com gamas semelhantes para os dois variáveis, é apenas o relacionamento entre elas que é diferente nas duas populações), então podemos ajustar os dois modelos a seguir:xyxy

y^=b0 0+b1 1x+b2g

e

y^=b0 0+b1 1x+b2g+b3xg

Onde são os coeficientes do modelo e g é uma variável / fator de agrupamento, indicando a qual conjunto de dados cada observação pertence.bEug

Podemos usar uma tabela ANOVA ou razão F para testar se o segundo modelo mais complexo se ajusta melhor aos dados que o modelo mais simples. O modelo mais simples afirma que as inclinações das duas linhas são iguais ( ), mas as linhas são deslocadas uma da outra por uma quantidade b 2 .b1 1b2

O modelo mais complexo inclui uma interação entre a inclinação da linha e a variável de agrupamento. Se o coeficiente para esse termo de interação for significativamente diferente de zero ou a razão ANOVA / F indicar que o modelo mais complexo se ajusta melhor aos dados, devemos rejeitar a hipótese nula de que duas linhas são paralelas.

Aqui está um exemplo em R usando dados fictícios. Primeiro, dados com inclinações iguais:

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)

Que 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

Indicando que falhamos em rejeitar a hipótese nula de declives iguais nesta amostra de dados. Obviamente, gostaríamos de garantir que tivéssemos poder suficiente para detectar uma diferença, se realmente houvesse uma, para não sermos levados a falhar erroneamente em rejeitar o nulo, porque o tamanho da amostra era muito pequeno para o efeito esperado.

Agora com diferentes declives.

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)

Que 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

Aqui temos evidências substanciais contra a hipótese nula e, portanto, podemos rejeitá-la em favor da alternativa (em outras palavras, rejeitamos a hipótese de que as inclinações das duas linhas são iguais).

b3xg

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

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 voltarmos para o modelo ajustado ao segundo conjunto de dados, onde diferimos as inclinações para os dois grupos, veremos que a diferença estimada nas inclinações das duas linhas é de ~ 1 unidade.

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

xt

> 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

muito obrigado por esta muito boa explicação. Meu objetivo é entender se o sloper é menor ou mais o mesmo, então acho que usarei o ANOVA para testá-lo.
02

Se eu tenho dois vetores distintos e gostaria de comparar seus slops, mas não tenho y (lm (x ~ y), como posso usar ANOVA?) Tentei anova (lm (x ~ 1), lm (y ~ 1)), mas eu recebo um aviso #
11159 Dail

O que você quer dizer com vetores aqui? No sentido R ou no sentido matemático? Isso é muito diferente da pergunta que você colocou, por isso, começar uma nova pergunta - se não editar este - é impossível realizar follow-ups de tão ampla a natureza nos comentários.
Gavin Simpson

não, espere, tenho que comparar dois modelos com ANOVA ... ok, mas se eu criar um modelo com esta fórmula: x ~ 1 e outro modelo com y ~ 1, recebo o aviso. Eu estou falando no sentido R. Como eu posso fazer?
Dail

11
@Dail Se você ajustou duas regressões para obter duas inclinações / linhas, possui dados x e y para os dois conjuntos de dados. Como eu disse na minha resposta, se os xs e ys são comparáveis ​​nos dois conjuntos de dados, você pode apenas combinar todos os dados e adicionar uma variável de agrupamento. Meu exemplo mostra como fazer isso usando dados fictícios, mas você já possui dados xey, são os dados que você usou para ajustar as regressões separadas.
Gavin Simpson

8

A primeira pergunta é realmente da geometria. Se você tiver duas linhas do formulário:

y=uma1 1x+b1 1
y=uma2x+b2

uma1 1=uma2

bronzeadoα=uma1 1αxuma1 1

α=arctanuma1 1

2π=360

α=arctanuma1 13602π.

arctanatan

Código R de amostra:

> 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 

A última linha são os graus.

uma1 1

α=180-arctanuma1 13602π.

Nota. Embora tenha sido divertido me lembrar da trigonometria do ensino médio, a resposta realmente útil é a de Gavin Simpson. Como as inclinações das linhas de regressão são variáveis ​​aleatórias, para compará-las, deve-se usar a estrutura de hipóteses estatísticas.


obrigado! como obter a inclinação da regressão? eu tenho que obter coeficiente e interceptar?
Dail

talvez a regressão linear retorne os graus diretamente com alguma função?
Dail

dizer degress = +45 e degress = -315 não é a mesma linha? whare não está falando sobre a mesma linha?
Dail

1

... acompanhando a resposta do @mpiktas, veja como você extrairia a inclinação de um lmobjeto e aplicaria a fórmula acima.

# 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 

muito obrigado pelo exemplo, neste caso os graus são -200?
Dail

Sim. Se você acha que seu problema foi resolvido, marque a resposta @mpiktas como a correta, obrigado.
Roman Luštrik

2π

11
@ RomanLuštrik, eu corrigi o código e adicionei a saída correta. Sinta-se livre para remover a correção.
mpiktas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.