2016-05-21 6 views
4

J'utilise un ensemble de points qui vont de (-5,5) à (0,0) et (5,5) en "V symétrique". Je souhaite installer un modèle avec lm() et la fonction bs() pour adapter une « forme en V » spline:Comment interpréter les estimations des coefficients lm() lors de l'utilisation de la fonction bs() pour les splines

je reçois le « V-forme » quand je prédis les résultats par predict() et tracer la ligne de prédiction. Mais quand je regarde les estimations du modèle coef(), je vois des estimations auxquelles je ne m'attendais pas.

Coefficients: 
           Estimate Std. Error t value Pr(>|t|) 
(Intercept)      4.93821 0.16117 30.639 1.40e-09 *** 
bs(x, degree = 1, knots = c(0))1 -5.12079 0.24026 -21.313 2.47e-08 *** 
bs(x, degree = 1, knots = c(0))2 -0.05545 0.21701 -0.256 0.805 

Je me attends à un coefficient -1 pour la première partie et un coefficient +1 pour la deuxième partie. Dois-je interpréter les estimations différemment?

Si je fais le nœud dans la fonction lm() manuellement que je reçois ces coefficients:

Coefficients: 
      Estimate Std. Error t value Pr(>|t|)  
(Intercept) -0.18258 0.13558 -1.347 0.215  
x   -1.02416 0.04805 -21.313 2.47e-08 *** 
z   2.03723 0.08575 23.759 1.05e-08 *** 

C'est plus comme ça. Z (point de noeud) changement relatif à x est ~ +1

Je veux comprendre comment interpréter le résultat bs(). J'ai vérifié, le manuel et bs les valeurs de prédiction du modèle sont exactement les mêmes.

+0

Désolé, ce n'était pas fait exprès, j'ai pensé que je pourrais peut-être les sélectionner tous les deux comme valides. – PDG

+1

Les deux réponses me disent la même chose à la fin ... cependant pour moi-même je voulais comprendre pourquoi les coefficients diffèrent donc je peux comprendre la logique. Les deux réponses conduisent à la façon de calculer les valeurs de coefficient réelles, mais pour moi, Zheyuan m'a donné aussi une explication détaillée de la logique derrière elle et donc c'est ma réponse préférée. – PDG

+0

Désolé pour ça @rbm – PDG

Répondre

14

Je me attends à un coefficient -1 pour la première partie et une +1 coeffici ent pour la deuxième partie.

Je pense que votre question est vraiment ce qui est une fonction B-spline. Si vous voulez comprendre la signification des coefficients, vous devez savoir quelles sont les fonctions de base de votre spline.Voir les éléments suivants:

library(splines) 
x <- seq(-5, 5, length = 100) 
b <- bs(x, degree = 1, knots = 0) ## returns a basis matrix 
str(b) ## check structure 
b1 <- b[, 1] ## basis 1 
b2 <- b[, 2] ## basis 2 
par(mfrow = c(1, 2)) 
plot(x, b1, type = "l", main = "basis 1: b1") 
plot(x, b2, type = "l", main = "basis 2: b2") 

basis

Note:

  1. B-splines de degré 1 sont fonctions de tente, comme vous pouvez le voir b1;
  2. B-splines de degré-1 sont mis à l'échelle, de sorte que leur valeur fonctionnelle est entre (0, 1);
  3. un nœuds d'une B-spline de degré-1 est où il plie;
  4. B-splines de degré-1 sont compact, et sont seulement non-nul sur (pas plus de) trois noeuds adjacents.

Vous pouvez obtenir l'expression (récursive) de B-splines à partir de Definition of B-spline. B-spline de degré 0 est la plus classe de base, tandis que

  • B-spline de degré 1 est une combinaison linéaire de B-spline de degré 0
  • B-spline de degré 2 est une combinaison linéaire de B-spline de degré 1
  • B-spline de degré 3 est une combinaison linéaire de B-spline de degré 2

(Désolé, je recevais hors sujet ...)

Votre régression linéaire à l'aide de B-splines:

y ~ bs(x, degree = 1, knots = 0) 

est juste en train de faire:

y ~ b1 + b2 

Maintenant, vous devriez être en mesure de comprendre ce coefficient vous obtenez moyen, cela signifie que la fonction spline est:

-5.12079 * b1 - 0.05545 * b2 

Dans le tableau sommaire:

Coefficients: 
           Estimate Std. Error t value Pr(>|t|) 
(Intercept)      4.93821 0.16117 30.639 1.40e-09 *** 
bs(x, degree = 1, knots = c(0))1 -5.12079 0.24026 -21.313 2.47e-08 *** 
bs(x, degree = 1, knots = c(0))2 -0.05545 0.21701 -0.256 0.805 

Vous pourriez vous demander pourquoi le coefficient de b2 n'est pas significatif. Eh bien, comparer votre y et b1: Votre y est forme en V symétrique, tandis que b1 est forme en V inverse symétrique. Si vous multipliez d'abord -1 par b1, et redimensionnez-le en multipliant 5, (ceci explique le coefficient -5 pour b1), qu'obtenez-vous? Bon match, non? Donc, il n'y a pas besoin de b2.

Cependant, si votre y est asymétrique, creux en cours d'exécution (-5,5)-(0,0), puis à (5,10), vous remarquerez que les coefficients pour b1 et b2 sont tous les deux importants.Je pense que l'autre réponse vous a déjà donné un tel exemple.


reparamétrisation de B-spline équipée de polynôme par morceaux est démontrée ici: Reparametrize fitted regression spline as piece-wise polynomials and export polynomial coefficients.

10

Un exemple simple de la première spline de degré avec noeud simple et interprétation des coefficients estimés pour calculer la pentedes lignes équipées:

library(splines) 
set.seed(313) 
x<-seq(-5,+5,len=1000) 
y<-c(seq(5,0,len=500)+rnorm(500,0,0.25), 
    seq(0,10,len=500)+rnorm(500,0,0.25)) 
plot(x,y, xlim = c(-6,+6), ylim = c(0,+8)) 
fit <- lm(formula = y ~ bs(x, degree = 1, knots = c(0))) 
x.predict <- seq(-2.5,+2.5,len = 100) 
lines(x.predict, predict(fit, data.frame(x = x.predict)), col =2, lwd = 2) 

produit terrain enter image description here Puisque nous équipons une spline avec degree=1 (ligne droite) et avec un noeud à x=0, nous avons deux lignes pour x<=0 et x>0.

Les coefficients sont

> round(summary(fit)$coefficients,3) 
           Estimate Std. Error t value Pr(>|t|) 
(Intercept)       5.014  0.021 241.961  0 
bs(x, degree = 1, knots = c(0))1 -5.041  0.030 -166.156  0 
bs(x, degree = 1, knots = c(0))2 4.964  0.027 182.915  0 

qui peut être traduit dans les pistes pour chacune de la ligne droite à l'aide du noeud (que nous avons spécifié au x=0) et des noeuds limites (min/max des données explicatif):

# two boundary knots and one specified 
knot.boundary.left <- min(x) 
knot <- 0 
knot.boundary.right <- max(x) 

slope.1 <- summary(fit)$coefficients[2,1] /(knot - knot.boundary.left) 
slope.2 <- (summary(fit)$coefficients[3,1] - summary(fit)$coefficients[2,1])/(knot.boundary.right - knot) 
slope.1 
slope.2 
> slope.1 
[1] -1.008238 
> slope.2 
[1] 2.000988