J'essaie d'adapter une spline pour un GLM à l'aide de R. Une fois que j'ai ajusté la spline, je veux pouvoir prendre mon modèle résultant et créer un fichier de modélisation dans un classeur Excel.
Par exemple, supposons que j'ai un ensemble de données où y est une fonction aléatoire de x et la pente change brusquement à un point spécifique (dans ce cas @ 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)
J'adapte maintenant ceci en utilisant
library(splines)
spline1 <- glm(y~ns(x,knots=c(500)),data=df,family=Gamma(link="log"))
et mes résultats montrent
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
À ce stade, je peux utiliser la fonction de prédiction dans r et obtenir des réponses parfaitement acceptables. Le problème est que je veux utiliser les résultats du modèle pour créer un classeur dans Excel.
Ma compréhension de la fonction prédire est que, étant donné une nouvelle valeur "x", r branche ce nouveau x dans la fonction spline appropriée (soit la fonction pour les valeurs supérieures à 500 ou celle pour les valeurs inférieures à 500), alors il prend ce résultat et multiplie il par le coefficient approprié et à partir de ce point le traite comme tout autre terme de modèle. Comment obtenir ces fonctions splines?
(Remarque: je me rends compte qu'un GLM gamma lié au journal peut ne pas être approprié pour l'ensemble de données fourni. Je ne demande pas comment ni quand adapter les GLM. Je fournis cet ensemble comme exemple à des fins de reproductibilité.)
rm(list=ls())
), surtout pas sans avertissement. Quelqu'un peut copier-coller votre code dans une session ouverte de R où ils ont des variables déjà (mais pas appelésx
,y
,df
ouspline1
) et manque que votre code efface leur travail. Est-ce un peu stupide pour eux de faire ça? Oui. Mais il est toujours poli de les laisser décider quand supprimer leurs propres variables.Réponses:
Vous pouvez effectuer une rétro-ingénierie des formules splines sans avoir à entrer dans le
R
code. Il suffit de savoir queUne spline est une fonction polynomiale par morceaux.
Les coefficients d'un polynôme peuvent être obtenus par régression linéaire.
R
R
Cette méthode fonctionnera avec tous les logiciels statistiques, même les logiciels propriétaires non documentés dont le code source n'est pas disponible.
R
R
(Les quadrillages gris verticaux dans la
R
version indiquent où se trouvent les nœuds internes.)Voici le
R
code complet . C'est un hack non sophistiqué, reposant entièrement sur lapaste
fonction pour effectuer la manipulation de chaîne. (Une meilleure façon serait de créer un modèle de formule et de le remplir à l'aide de commandes de correspondance et de substitution de chaînes.)La première formule de sortie spline (sur les quatre produites ici) est
R
la source
ns.formula
.. pensez- vous en R?! Sérieusement, votre méthode semble très utile, mais il semble ironique de devoir pirater un hack pour obtenir ces paramètres. Serait très utile pour sortir un tableau ..Vous avez déjà fait ce qui suit:
Maintenant, je vais vous montrer comment prédire (la réponse) pour x = 12 de deux manières différentes: D'abord en utilisant la fonction de prédiction (le plus simple!)
La 2ème voie est basée directement sur la matrice du modèle. Remarque J'ai utilisé
exp
car la fonction de liaison utilisée est log.Notez que ci-dessus j'ai extrait le 12ème élément, car cela correspond à x = 12. Si vous souhaitez prédire un x en dehors de l'ensemble d'entraînement, vous pouvez simplement utiliser à nouveau la fonction de prédiction. Disons que nous voulons trouver la valeur de réponse prédite pour x = 1100 puis
la source
Vous pouvez trouver plus facile d'utiliser la base de puissance tronquée pour les splines de régression cubique, en utilisant le
rms
package R. Une fois le modèle ajusté, vous pouvez récupérer la représentation algébrique de la fonction spline ajustée à l'aide des fonctionsFunction
ou .latex
rms
la source
Function()
ne dit pas vraiment ce qu'elle fait. Dans mon cas (voir les détails sur Rpubs rpubs.com/EmilOWK/rms_splines ), j'obtiensfunction(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>
La-2863.7787
valeur est le premier coef du modèle,245.72672
le second et le dernier coef-873.0223
n'est pas vu dans l'équation nulle part. Il en va de même pour la sortie delatex()
.Function
fonctionne avecGlm()
lorsque vous utilisezrcs
la fonction spline. La sortie reformule la spline sous sa forme la plus simple en écrivant comme si les restrictions de queue linéaires n'étaient pas là (mais elles le sont) comme détaillé dans mes notes de cours RMS .