Estou tentando ajustar um spline para um GLM usando R. Depois de ajustar o spline, quero poder pegar meu modelo resultante e criar um arquivo de modelagem em uma pasta de trabalho do Excel.
Por exemplo, digamos que eu tenho um conjunto de dados em que y é uma função aleatória de xe a inclinação muda abruptamente em um ponto específico (neste caso @ x = 500).
set.seed(1066)
x<- 1:1000
y<- rep(0,1000)
y[1:500]<- pmax(x[1:500]+(runif(500)-.5)*67*500/pmax(x[1:500],100),0.01)
y[501:1000]<-500+x[501:1000]^1.05*(runif(500)-.5)/7.5
df<-as.data.frame(cbind(x,y))
plot(df)
Agora eu me encaixo nisso usando
library(splines)
spline1 <- glm(y~ns(x,knots=c(500)),data=df,family=Gamma(link="log"))
e meus resultados mostram
summary(spline1)
Call:
glm(formula = y ~ ns(x, knots = c(500)), family = Gamma(link = "log"),
data = df)
Deviance Residuals:
Min 1Q Median 3Q Max
-4.0849 -0.1124 -0.0111 0.0988 1.1346
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.17460 0.02994 139.43 <2e-16 ***
ns(x, knots = c(500))1 3.83042 0.06700 57.17 <2e-16 ***
ns(x, knots = c(500))2 0.71388 0.03644 19.59 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for Gamma family taken to be 0.1108924)
Null deviance: 916.12 on 999 degrees of freedom
Residual deviance: 621.29 on 997 degrees of freedom
AIC: 13423
Number of Fisher Scoring iterations: 9
Neste ponto, eu posso usar a função de previsão dentro de r e obter respostas perfeitamente aceitáveis. O problema é que eu quero usar os resultados do modelo para criar uma pasta de trabalho no Excel.
Meu entendimento da função de previsão é que, dado um novo valor "x", r conecta esse novo x na função spline apropriada (seja a função para valores acima de 500 ou a para valores abaixo de 500), então pega esse resultado e multiplica pelo coeficiente apropriado e a partir desse ponto o trata como qualquer outro termo modelo. Como obtenho essas funções spline?
(Observação: percebo que um GLM gama vinculado a log pode não ser apropriado para o conjunto de dados fornecido. Não estou perguntando como ou quando ajustar os GLMs. Estou fornecendo esse conjunto como um exemplo para fins de reprodutibilidade.)
rm(list=ls())
), especialmente não sem nenhum aviso. Alguém pode copiar e colar o código em uma sessão aberta de R onde eles têm algumas variáveis já (mas nenhum chamadox
,y
,df
ouspline1
) e falta de que seu código apaga o seu trabalho. É meio idiota para eles fazerem isso? Sim. Mas ainda é educado deixá-los decidir quando excluir suas próprias variáveis.Respostas:
Você pode fazer engenharia reversa das fórmulas de spline sem precisar entrar no
R
código. Basta saber queUm spline é uma função polinomial composta por partes.
Os coeficientes de um polinômio podem ser obtidos via regressão linear.
R
R
Este método funcionará com qualquer software estatístico, mesmo software proprietário não documentado, cujo código fonte não esteja disponível.
R
R
(As linhas de grade cinzas verticais na
R
versão mostram onde estão os nós internos.)Aqui está o
R
código completo . É um hack não sofisticado, confiando inteiramente napaste
função para realizar a manipulação de strings. (Uma maneira melhor seria criar um modelo de fórmula e preenchê-lo usando comandos de correspondência e substituição de string.)A primeira fórmula de saída de spline (das quatro produzidas aqui) é
R
fonte
ns.formula
.. você pensa em R ?! Sério, seu método parece muito útil, mas parece irônico ter que invadir um hack para obter esses parâmetros. Seria muito útil para a saída de uma tabela ..Você já fez o seguinte:
Agora vou mostrar como prever (a resposta) para x = 12 de duas maneiras diferentes: Primeiro, usando a função de previsão (a maneira mais fácil!)
A segunda maneira é baseada diretamente na matriz do modelo. Nota: usei,
exp
pois a função de link usada é log.Observe que, acima, extraí o 12º elemento, pois corresponde a x = 12. Se você deseja prever um x fora do conjunto de treinamento, basta usar novamente a função de previsão. Digamos que queremos encontrar o valor de resposta previsto para x = 1100 e, em seguida,
fonte
Você pode achar mais fácil usar a base de potência truncada para splines de regressão cúbica, usando o
rms
pacote R. Depois de ajustar o modelo que você pode recuperar a representação algébrica da função spline equipada usando oFunction
oulatex
funçõesrms
.fonte
Function()
realmente não diz o que faz. No meu caso (veja detalhes em Rpubs rpubs.com/EmilOWK/rms_splines ), recebofunction(x = NA) {-2863.7787+245.72672* x-0.1391794*pmax(x-10.9,0)^3+0.27835881*pmax(x-50.5,0)^3-0.1391794*pmax(x-90.1,0)^3 } <environment: 0x556156e80db8>
O-2863.7787
valor é o primeiro coef no modelo,245.72672
o segundo e o último coef-873.0223
não é visto na equação em nenhum lugar. O mesmo se aplica à saída delatex()
.Function
funcionaGlm()
quando você usarcs
como a função spline. A saída está reformulando o spline da forma mais simples, escrevendo como se as restrições lineares não estivessem lá (mas estão), conforme detalhado nas notas do curso do RMS .