Como encontro um valor p da regressão spline / loess suave?

10

Eu tenho algumas variáveis ​​e estou interessado em encontrar relações não lineares entre elas. Então, decidi encaixar um spline ou loess e imprimir bons gráficos (veja o código abaixo). Mas também quero ter algumas estatísticas que me dêem uma idéia do quanto é provável que o relacionamento seja uma questão de aleatoriedade ... ou seja, preciso de algum valor p geral, como tenho para a regressão linear, por exemplo. Em outras palavras, preciso saber se a curva ajustada faz algum sentido, pois meu código ajustará uma curva a qualquer dado.

x <- rnorm(1000)
y <- sin(x) + rnorm(1000, 0, 0.5)

cor.test(x,y)
plot(x, y, xlab = xlab, ylab = ylab)
spl1 <- smooth.spline(x, y, tol = 1e-6, df = 8)
lines(spl1, col = "green", lwd = 2)

spl2 <- loess(y ~ x)
x.pr <- seq(min(x), max(x), length.out = 100)
lines(x.pr, predict(spl2, x.pr), col = "blue", lwd = 2)
Curioso
fonte

Respostas:

8

A biblioteca de splines possui funções bse nsque criará uma base de spline para usar com a lmfunção. Você poderá ajustar um modelo linear e um modelo incluindo splines e usar a anovafunção para fazer o teste de modelo completo e reduzido para verificar se o modelo de spline se encaixa significativamente melhor que o modelo linear.

Aqui está um exemplo de código:

x <- rnorm(1000)
y <- sin(x) + rnorm(1000, 0, 0.5)

library(splines)

fit1 <- lm(y~x)
fit0 <- lm(y~1)
fit2 <- lm(y~bs(x,5))

anova(fit1,fit2)
anova(fit0,fit2)

plot(x,y, pch='.')
abline(fit1, col='red')
xx <- seq(min(x),max(x), length.out=250)
yy <- predict(fit2, data.frame(x=xx))
lines(xx,yy, col='blue')

Você também pode usar a polyfunção para fazer um ajuste polinomial e testar os termos não lineares como um teste de curvatura.

R2

Existem técnicas para calcular e plotar um intervalo de confiança para um ajuste menor (acho que pode haver uma maneira integrada no pacote ggplot2), você pode plotar a banda de confiança e ver se uma linha reta se encaixaria dentro da banda (isso não é um valor p, mas ainda dá um sim / não.

Você pode ajustar um modelo linear e pegar os resíduos e ajustar um modelo de loess aos resíduos como resposta (e a variável de interesse como preditor), se o modelo verdadeiro for linear, esse ajuste deve estar próximo de uma linha plana e reordenar os pontos em relação ao preditor não deve fazer nenhuma diferença. Você pode usar isso para criar um teste de permutação. Ajuste o loess, encontre o valor previsto mais distante de 0, agora permita aleatoriamente os pontos e ajuste um novo loess e encontre o ponto previsto mais distante de 0, repita várias vezes, o valor p é a proporção dos valores permutados que estão mais longe de 0 que o valor original.

Você também pode considerar a validação cruzada como um método para escolher a menor largura de banda. Isso não fornece um valor p, mas uma largura de banda infinita corresponde a um modelo linear perfeito, se a validação cruzada sugere uma largura de banda muito grande, isso sugere que um modelo linear pode ser razoável, se as larguras de banda mais altas forem claramente inferiores a algumas das as larguras de banda menores sugerem curvatura definida e linear não é suficiente.

Greg Snow
fonte
Obrigado Greg! Eu acho que o primeiro parágrafo soa como o caminho a percorrer, exceto que eu não estou interessado em comparação com o modelo linear, apenas para ver se o spline o explica ou não. Você poderia fornecer algum código ou ponteiros mais concretos sobre como testar o spline com anova? Eu estive analisando as funções bs e ns, mas não sou tão bom em estatística para poder inventar isso sozinho.
curioso
R2R2
anovaR2R21 1-R2R21 1-R2
Greg, obrigado! 1) Você poderia explicar o que está lm(y~bs(x,5))fazendo e por que não está lm(y~I(bs(x,5)))? Estou bastante confuso com esta chamada porque o resultado de bs (x, 5) não é uma variável ... 2) Entendo corretamente que o valor-p que estou procurando é o resultado anova(fit0,fit2)?
Curioso
11
xx2x3bsxlm