Compare a significância estatística da diferença entre duas regressões polinomiais em R


10

Então, antes de tudo, pesquisei neste fórum e sei que perguntas extremamente semelhantes foram feitas, mas geralmente não foram respondidas adequadamente ou, às vezes, a resposta simplesmente não é detalhada o suficiente para que eu possa entender. Então, desta vez, minha pergunta é: tenho dois conjuntos de dados, em cada um, faço uma regressão polinomial assim:

Ratio<-(mydata2[,c(2)])
Time_in_days<-(mydata2[,c(1)])
fit3IRC <- lm( Ratio~(poly(Time_in_days,2)) )

Os gráficos de regressões polinomiais são:

insira a descrição da imagem aqui

Os coeficientes são:

> as.vector(coef(fit3CN))
[1] -0.9751726 -4.0876782  0.6860041
> as.vector(coef(fit3IRC))
[1] -1.1446297 -5.4449486  0.5883757 

E agora quero saber se existe uma maneira de usar uma função R para fazer um teste que me diga se existe ou não significância estatística na diferença entre a regressão de dois polinômios, sabendo que o intervalo de dias relevante é [ 1.100].

Pelo que entendi, não posso aplicar diretamente o teste anova, porque os valores vêm de dois conjuntos de dados diferentes, nem o AIC, que é usado para comparar dados modelo / verdadeiros.

Tentei seguir as instruções fornecidas pelo @Roland na pergunta relacionada, mas provavelmente não entendi algo ao analisar meus resultados:

Aqui está o que eu fiz:

Combinei meus dois conjuntos de dados em um.

fé o fator variável sobre o qual a @Roland falou. Coloquei 1s para o primeiro set e 0s para o outro.

y<-(mydata2[,c(2)])
x<-(mydata2[,c(1)])
f<-(mydata2[,c(3)])

plot(x,y, xlim=c(1,nrow(mydata2)),type='p')

fit3ANOVA <- lm( y~(poly(x,2)) )

fit3ANOVACN <- lm( y~f*(poly(x,2)) )

Meus dados ficam assim agora:

insira a descrição da imagem aqui

O vermelho fit3ANOVAainda está funcionando, mas eu tenho um problema com o azul, fit3ANOVACNo modelo tem resultados estranhos. Não sei se o modelo de ajuste está correto, não entendo exatamente o que @Roland significava.

Considerando a solução @DeltaIV, suponho que, nesse caso: insira a descrição da imagem aqui Os modelos sejam significativamente diferentes, mesmo que se sobreponham. Estou certo em assumir isso?


Parece-me que o comentário do usuário @ Roland à pergunta para a qual você está vinculando responde perfeitamente à sua pergunta. O que é exatamente isso que você não entende?
DeltaIV 22/08/16

Bem, algumas coisas, eu não tinha certeza se essa era uma resposta adequada, uma vez que estava na seção de comentários, mas, se estiver funcionando, só preciso ter certeza de que entendi. Basicamente, devo criar um novo conjunto de dados em que crie uma coluna com 1s e 0s, dependendo de quais conjuntos de dados eles originalmente vieram? Depois disso, crio dois modelos, um com todos os dados e outro com apenas um dos conjuntos de dados levados em consideração. Então eu aplico o teste de anova. É isso ? Também nunca usei o teste de anova, vi que eles falavam sobre valor-p adequado, o que seria exatamente isso?
PaoloH 22/08/16

11
[0,100]

Respostas:


15
#Create some example data
mydata1 <- subset(iris, Species == "setosa", select = c(Sepal.Length, Sepal.Width))
mydata2 <- subset(iris, Species == "virginica", select = c(Sepal.Length, Sepal.Width))

#add a grouping variable
mydata1$g <- "a"
mydata2$g <- "b"

#combine the datasets
mydata <- rbind(mydata1, mydata2)

#model without grouping variable
fit0 <- lm(Sepal.Width ~ poly(Sepal.Length, 2), data = mydata)

#model with grouping variable
fit1 <- lm(Sepal.Width ~ poly(Sepal.Length, 2) * g, data = mydata)

#compare models 
anova(fit0, fit1)
#Analysis of Variance Table
#
#Model 1: Sepal.Width ~ poly(Sepal.Length, 2)
#Model 2: Sepal.Width ~ poly(Sepal.Length, 2) * g
#  Res.Df     RSS Df Sum of Sq      F    Pr(>F)    
#1     97 16.4700                                  
#2     94  7.1143  3    9.3557 41.205 < 2.2e-16 ***
#  ---
#  Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Como você vê, fit1é significativamente melhor que fit0, ou seja, o efeito da variável de agrupamento é significativo. Como a variável de agrupamento representa os respectivos conjuntos de dados, os ajustes polinomiais nos dois conjuntos de dados podem ser considerados significativamente diferentes.


Sinto muito, isso deve ser óbvio, mas não estou familiarizado com os resultados do teste Anova. O que está nos dizendo que o fit1 é melhor que o fit0? É o Pr (> F) que é extremamente baixo?
PaoloH 22/08/19

11
O valor p indica se os modelos são significativamente diferentes (valor p menor significa "mais diferente", levando em consideração a variação, geralmente p <0,05 é considerado significativo). O RSS menor indica o melhor modelo de ajuste.
Roland

@PaoloH Btw., Você deve evitar proporções como variáveis ​​dependentes. Pressupostos de modelos comuns de mínimos quadrados não se sustentam com uma variável tão dependente.
Roland

8

A resposta da @Ronald é a melhor e é amplamente aplicável a muitos problemas semelhantes (por exemplo, existe uma diferença estatisticamente significante entre homens e mulheres na relação entre peso e idade?). No entanto, adicionarei outra solução que, embora não seja quantitativa (não fornece um valor- p ), fornece uma boa exibição gráfica da diferença.

EDIT : de acordo com essa pergunta , parece que predict.lma função usada ggplot2para calcular os intervalos de confiança não calcula faixas de confiança simultâneas em torno da curva de regressão, mas apenas faixas de confiança pontuais. Essas últimas bandas não são as corretas para avaliar se dois modelos lineares ajustados são estatisticamente diferentes, ou dito de outra maneira, se poderiam ser compatíveis com o mesmo modelo verdadeiro ou não. Portanto, elas não são as curvas certas para responder à sua pergunta. Como aparentemente não há R embutido para obter faixas de confiança simultâneas (estranho!), Escrevi minha própria função. Aqui está:

simultaneous_CBs <- function(linear_model, newdata, level = 0.95){
    # Working-Hotelling 1 – α confidence bands for the model linear_model
    # at points newdata with α = 1 - level

    # summary of regression model
    lm_summary <- summary(linear_model)
    # degrees of freedom 
    p <- lm_summary$df[1]
    # residual degrees of freedom
    nmp <-lm_summary$df[2]
    # F-distribution
    Fvalue <- qf(level,p,nmp)
    # multiplier
    W <- sqrt(p*Fvalue)
    # confidence intervals for the mean response at the new points
    CI <- predict(linear_model, newdata, se.fit = TRUE, interval = "confidence", 
                  level = level)
    # mean value at new points
    Y_h <- CI$fit[,1]
    # Working-Hotelling 1 – α confidence bands
    LB <- Y_h - W*CI$se.fit
    UB <- Y_h + W*CI$se.fit
    sim_CB <- data.frame(LowerBound = LB, Mean = Y_h, UpperBound = UB)
}

library(dplyr)
# sample datasets
setosa <- iris %>% filter(Species == "setosa") %>% select(Sepal.Length, Sepal.Width, Species)
virginica <- iris %>% filter(Species == "virginica") %>% select(Sepal.Length, Sepal.Width, Species)

# compute simultaneous confidence bands
# 1. compute linear models
Model <- as.formula(Sepal.Width ~ poly(Sepal.Length,2))
fit1  <- lm(Model, data = setosa)
fit2  <- lm(Model, data = virginica)
# 2. compute new prediction points
npoints <- 100
newdata1 <- with(setosa, data.frame(Sepal.Length = 
                                       seq(min(Sepal.Length), max(Sepal.Length), len = npoints )))
newdata2 <- with(virginica, data.frame(Sepal.Length = 
                                          seq(min(Sepal.Length), max(Sepal.Length), len = npoints)))
# 3. simultaneous confidence bands
mylevel = 0.95
cc1 <- simultaneous_CBs(fit1, newdata1, level = mylevel)
cc1 <- cc1 %>% mutate(Species = "setosa", Sepal.Length = newdata1$Sepal.Length)
cc2 <- simultaneous_CBs(fit2, newdata2, level = mylevel)
cc2 <- cc2 %>% mutate(Species = "virginica", Sepal.Length = newdata2$Sepal.Length)

# combine datasets
mydata <- rbind(setosa, virginica)
mycc   <- rbind(cc1, cc2)    
mycc   <- mycc %>% rename(Sepal.Width = Mean) 
# plot both simultaneous confidence bands and pointwise confidence
# bands, to show the difference
library(ggplot2)
# prepare a plot using dataframe mydata, mapping sepal Length to x,
# sepal width to y, and grouping the data by species
p <- ggplot(data = mydata, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + 
# add data points
geom_point() +
# add quadratic regression with orthogonal polynomials and 95% pointwise
# confidence intervals
geom_smooth(method ="lm", formula = y ~ poly(x,2)) +
# add 95% simultaneous confidence bands
geom_ribbon(data = mycc, aes(x = Sepal.Length, color = NULL, fill = Species, ymin = LowerBound, ymax = UpperBound),alpha = 0.5)
print(p)

insira a descrição da imagem aqui

As bandas interiores são aqueles calculados por padrão por geom_smooth: estes são pontuais 95% intervalos de confiança em torno das curvas de regressão. As bandas externas semitransparentes (obrigado pela dica de gráficos, @Roland) são as bandas simultâneas de 95% de confiança. Como você pode ver, eles são maiores que as bandas pontuais, como esperado. O fato de as faixas de confiança simultâneas das duas curvas não se sobreporem pode ser tomado como uma indicação do fato de que a diferença entre os dois modelos é estatisticamente significativa.

Obviamente, para um teste de hipótese com um valor p válido , a abordagem @Roland deve ser seguida, mas essa abordagem gráfica pode ser vista como análise exploratória de dados. Além disso, o enredo pode nos dar algumas idéias adicionais. É claro que os modelos para os dois conjuntos de dados são estatisticamente diferentes. Mas também parece que os modelos de dois graus 1 se encaixariam nos dados quase tão bem quanto nos dois modelos quadráticos. Podemos facilmente testar esta hipótese:

fit_deg1 <- lm(data = mydata, Sepal.Width ~ Species*poly(Sepal.Length,1))
fit_deg2 <- lm(data = mydata, Sepal.Width ~ Species*poly(Sepal.Length,2))
anova(fit_deg1, fit_deg2)
# Analysis of Variance Table

# Model 1: Sepal.Width ~ Species * poly(Sepal.Length, 1)
# Model 2: Sepal.Width ~ Species * poly(Sepal.Length, 2)
#  Res.Df    RSS Df Sum of Sq      F Pr(>F)
# 1     96 7.1895                           
# 2     94 7.1143  2  0.075221 0.4969   0.61

A diferença entre o modelo de grau 1 e o modelo de grau 2 não é significativa; portanto, também podemos usar duas regressões lineares para cada conjunto de dados.


3
+1 para plotagem. Uma parte crucial das análises estatísticas.
Roland

Apenas para ter certeza, no seu método: o fato de que "os intervalos de confiança das duas curvas não se sobrepõem pode ser tomado como uma indicação do fato de que a diferença entre os dois modelos é estatisticamente significativa". Mas não posso dizer que a diferença não seja significativa se elas se sobrepõem, certo?
PaoloH 23/08/16

Para ser mais específico, adicionei um exemplo no post.
PaoloH 23/08/16

@PaoloH, como você adicionou um novo gráfico à sua pergunta, adicionarei um comentário lá.
DeltaIV 23/08/16
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.