Definir nós em splines cúbicos naturais em R

23

Eu tenho dados com muitos recursos correlatos e quero começar reduzindo os recursos com uma função básica, antes de executar um LDA. Estou tentando usar splines cúbicos naturais no splinespacote com a nsfunção Como faço para atribuir os nós?

Aqui está o código R básico:

library(splines)
lda.pred <- lda(y ~ ns(x, knots=5))

Mas não tenho idéia de como escolher os nós ns.

Belmont
fonte
3
você está perguntando sobre como especificar os nós em (ou seja, através de argumentos para ns ) ou está perguntando sobre estratégias para decidir onde colocar os nós? R
cardeal
1
Veja Harrell, Regression Strategies 2015, para uma boa discussão sobre onde colocar os nós (não importa, portanto, os quantis são tão bons quanto tudo - as exceções são se você tiver razões sólidas para acreditar que o comportamento muda em algum momento) e número de nós (3, 4 ou 5, dependendo de N)
statsguy 28/05

Respostas:

40

Como especificar os nós em R

A nsfunção gera uma base de spline de regressão natural , dado um vetor de entrada. Os nós podem ser especificados por meio de um argumento de graus de liberdade dfque recebe um número inteiro ou por um argumento de nós knotsque aceita um vetor, fornecendo a colocação desejada dos nós. Observe que no código que você escreveu

library(splines)
lda.pred <- lda(y ~ ns(x, knots=5))

você não solicitou cinco nós, mas solicitou um único nó (interior) no local 5.

Se você usar o dfargumento, os nós internos serão selecionados com base nos quantis do vetor x. Por exemplo, se você fizer a ligação

ns(x, df=5)

A base incluirá dois nós de limite e quatro nós internos, colocados nos quantis 20, 40, 60 e 80 de x, respectivamente. Os nós de limite, por padrão, são colocados no mínimo e no máximo de x.

Aqui está um exemplo para especificar os locais dos nós

x <- 0:100
ns(x, knots=c(20,35,50))

Se você telefonar ns(x, df=4), você terá três nós internos nos locais 25, 50 e 75, respectivamente.

Você também pode especificar se deseja um termo de interceptação. Normalmente, isso não é especificado, pois nsé usado com mais frequência em conjunto com lm, o que inclui uma interceptação implicitamente (a menos que seja forçado a não fazê-lo). Se você usar intercept=TRUEsua chamada para ns, verifique se sabe por que está fazendo isso, pois se você fizer isso e depois ligar de forma lmingênua, a matriz de design acabará sendo deficiente em classificação.

Estratégias para dar nós

Os nós geralmente são colocados em quantis, como o comportamento padrão de ns. A intuição é que, se você tiver muitos dados agrupados juntos, poderá querer mais nós para modelar eventuais não linearidades nessa região. Mas isso não significa que essa seja (a) a única opção ou (b) a melhor escolha.

Obviamente, outras opções podem ser feitas e são específicas do domínio. Analisar histogramas e estimativas de densidade de seus preditores pode fornecer pistas sobre onde os nós são necessários, a menos que exista alguma opção "canônica" para seus dados.

Em termos de interpretação de regressões, eu observaria que, embora você possa "brincar" com a colocação de nós, você deve perceber que incorre em uma penalidade de seleção de modelo por isso, que deve ter o cuidado de avaliar e ajustar quaisquer inferências. resultado.

cardeal
fonte
Dado x <- 0:100, a maneira "correta" de definir os pontos de interrupção é fazer knots_x <- quantile(x, probs=c(.2, .35, .5)), que será usado ns(x, knots=knots_x)para definir 3 nós internos nos locais 25, 50 e 75, respectivamente. O que me confundido na resposta foi que eu estava esperando para necessidade de especificar os quantis desejados no knotsargumento, ao passo que eu preciso para valores reais de entrada do xvetor ...
landroni
Análise de Pesquisas de Saúde, por Edward L. Korn, Barry I. Graubard estado p.98 que Durrleman e Simon (1989) recomenda (0.05,0.50,0.95) para estrias naturais
Chris