Estoy tratando de ajustar una spline para un GLM usando R. Una vez que ajuste la spline, quiero poder tomar mi modelo resultante y crear un archivo de modelado en un libro de Excel.
Por ejemplo, supongamos que tengo un conjunto de datos donde y es una función aleatoria de xy la pendiente cambia abruptamente en un punto específico (en este 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)
Ahora encajo esto usando
library(splines)
spline1 <- glm(y~ns(x,knots=c(500)),data=df,family=Gamma(link="log"))
y mis resultados muestran
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
En este punto, puedo usar la función de predicción dentro de r y obtener respuestas perfectamente aceptables. El problema es que quiero usar los resultados del modelo para construir un libro de trabajo en Excel.
Entiendo que la función de predicción es que, dado un nuevo valor de "x", r conecta esa nueva x en la función de spline apropiada (ya sea la función para valores superiores a 500 o la de valores inferiores a 500), luego toma ese resultado y se multiplica por el coeficiente apropiado y desde ese punto lo trata como cualquier otro término modelo. ¿Cómo obtengo estas funciones de spline?
(Nota: me doy cuenta de que un GLM gamma vinculado a un registro puede no ser apropiado para el conjunto de datos proporcionado. No estoy preguntando cómo o cuándo ajustar los GLM. Estoy proporcionando ese conjunto como un ejemplo para fines de reproducibilidad).
rm(list=ls())
), especialmente sin ninguna advertencia. Alguien puede copiar y pegar el código en una sesión abierta del R donde tienen ya algunas variables (pero ninguna llamadax
,y
,df
ospline1
) y la señorita que su código borra su trabajo. ¿Es un poco tonto para ellos hacer eso? Sí. Pero sigue siendo cortés dejarles decidir cuándo eliminar sus propias variables.Respuestas:
Puede aplicar ingeniería inversa a las fórmulas de spline sin tener que ir al
R
código. Es suficiente saber queUna spline es una función polinómica por partes.
Los polinomios de grado están determinados por sus valores en d + 1 puntos.re re+ 1
Los coeficientes de un polinomio se pueden obtener mediante regresión lineal.
R
R
Este método funcionará con cualquier software estadístico, incluso software propietario no documentado cuyo código fuente no está disponible.
R
R
(Las líneas grises verticales en la
R
versión muestran dónde están los nudos internos).Aquí está el
R
código completo . Es un truco poco sofisticado, que se basa completamente en lapaste
función para lograr la manipulación de la cadena. (Una mejor manera sería crear una plantilla de fórmula y completarla utilizando los comandos de coincidencia y sustitución de cadenas).La primera fórmula de salida de spline (de las cuatro producidas aquí) es
R
fuente
ns.formula
.. piensas en R ?! En serio, su método parece muy útil, pero parece irónico tener que hackear un hack para obtener estos parámetros. Sería muy útil para generar una tabla ..Ya hiciste lo siguiente:
Ahora le mostraré cómo predecir (la respuesta) para x = 12 de dos maneras diferentes: Primero, use la función de predicción (¡la manera fácil!)
La segunda forma se basa directamente en la matriz del modelo. Nota que utilicé
exp
ya que la función de enlace utilizada es log.Tenga en cuenta que en el anterior extraje el elemento 12, ya que corresponde a x = 12. Si desea predecir una x fuera del conjunto de entrenamiento, simplemente puede volver a utilizar la función de predicción. Digamos que queremos encontrar el valor de respuesta pronosticado para x = 1100 y luego
fuente
Puede resultarle más fácil utilizar la base de potencia truncada para splines de regresión cúbica, utilizando el
rms
paquete R. Una vez que ajuste el modelo, puede recuperar la representación algebraica de la función de spline ajustada utilizando las funcionesFunction
olatex
enrms
.fuente
Function()
realmente no dice lo que hace. En mi caso (ver detalles en Rpubs rpubs.com/EmilOWK/rms_splines ), obtengofunction(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>
El-2863.7787
valor es el primer coef en el modelo,245.72672
el segundo y el último coef-873.0223
no se ve en la ecuación en ninguna parte. Lo mismo se aplica a la salida delatex()
.Function
funcionaGlm()
cuando se usarcs
como la función de spline. El resultado es reformular la spline en la forma más simple escribiendo como si las restricciones lineales de cola no estuvieran allí (pero están) como se detalla en mis notas del curso RMS .