2016-09-12 3 views
1

J'utilise souvent des B-splines pour la régression. Jusqu'à présent, je n'ai jamais eu besoin de comprendre la sortie de bs en détail: je voudrais simplement choisir le modèle qui m'intéressait, et l'adapter avec lm. Cependant, j'ai maintenant besoin de reproduire un modèle b-spline dans un code externe (non-R). Alors, quelle est la signification de la matrice générée par bs? Exemple:interprétation de la sortie de la fonction R bs() (matrice de base B-spline)

x <- c(0.0, 11.0, 17.9, 49.3, 77.4) 
bs(x, df = 3, degree = 1) # generate degree 1 (linear) B-splines with 2 internal knots 
#    1   2   3 
# [1,] 0.0000000 0.0000000 0.0000000  
# [2,] 0.8270677 0.0000000 0.0000000  
# [3,] 0.8198433 0.1801567 0.0000000  
# [4,] 0.0000000 0.7286085 0.2713915  
# [5,] 0.0000000 0.0000000 1.0000000 
# attr(,"degree") 
# [1] 1 
# attr(,"knots") 
# 33.33333% 66.66667% 
# 13.30000 38.83333 
# attr(,"Boundary.knots") 
# [1] 0.0 77.4 
# attr(,"intercept") 
# [1] FALSE 
# attr(,"class") 
# [1] "bs"  "basis" "matrix" 

Ok, alors degree est 1, comme je l'ai spécifié dans l'entrée. knots me dit que les deux nœuds internes sont à x = 13.3000 et x = 38.8333 respectivement. J'étais un peu surpris de voir que les nœuds sont à quantiles fixes, j'espérais que R trouverait les meilleurs quantiles pour mes données, mais bien sûr cela rendrait le modèle non linéaire, et ne serait pas non plus possible sans connaître les données de réponse. intercept = FALSE signifie qu'aucune interception n'a été incluse dans la base (est-ce une bonne chose? On m'a toujours appris à ne pas adapter les modèles linéaires sans interception ... Eh bien devinez lm est juste d'ajouter un de toute façon).

Cependant, qu'en est-il de la matrice? Je ne comprends pas vraiment comment l'interpréter. Avec trois colonnes, je pense que cela signifie que les fonctions de base sont trois. Cela est logique: si j'ai deux noeuds internes K1 et K2, je vais avoir une spline entre frontière gauche noeud B1 et K1, une autre spline entre K1 et K2, et un dernier entre K2 et B2, alors ... trois fonctions de base , D'accord. Mais quelles sont les fonctions de base exactement? Par exemple, que signifie cette colonne?

#    1 
# [1,] 0.0000000 
# [2,] 0.8270677 
# [3,] 0.8198433 
# [4,] 0.0000000 
# [5,] 0.0000000 

EDIT: ceci est similaire mais pas exactement la même chose que this question. Cette question porte sur l'interprétation des coefficients de régression, mais je suis une étape avant: je voudrais comprendre la signification des coefficients de la matrice du modèle. Si j'essaie de faire les mêmes parcelles que suggéré dans the first answer, je reçois un terrain foiré:

b <- bs(x, df = 3, degree = 1) 
b1 <- b[, 1] ## basis 1 
b2 <- b[, 2] ## basis 2 
b3 <- b[,3] 
par(mfrow = c(1, 3)) 
plot(x, b1, type = "l", main = "basis 1: b1") 
plot(x, b2, type = "l", main = "basis 2: b2") 
plot(x, b3, type = "l", main = "basis 3: b3") 

enter image description here

Ceux-ci ne peuvent être les fonctions de base B-splines, parce qu'ils ont trop de nœuds (chaque fonction ne devrait en avoir qu'une).

The second answer me permettrait effectivement de reconstruire mon modèle en dehors de R, donc je suppose que je pourrais aller avec ça. Cependant, cette réponse n'explique pas exactement ce que sont les éléments de la matrice b: elle traite des coefficients d'une régression linéaire, que je n'ai pas encore introduite ici. C'est vrai que c'est mon dernier objectif, mais je voulais aussi comprendre cette étape intermédiaire.

+0

@ZheyuanLi, bien, non. La question parle du coefficient «lm», je pose une question sur la fonction de base. [Cette réponse] (http://stackoverflow.com/a/37364459/1711271) n'explique pas quels sont les coefficients uniques de la matrice. Si je fais le même type de complot suggéré dans la première réponse, je reçois des ordures (certainement pas des fonctions B-splines, puisque leur maximum devrait être 1). [L'autre réponse] (http://stackoverflow.com/a/37363943/1711271) est meilleure, mais toujours pas exactement ce que j'ai demandé. J'ai édité la question pour montrer pourquoi. – DeltaIV

+0

Oooh, attends! Je l'ai! Je vais répondre à ma propre question, maintenant j'ai compris ce qu'est cette matrice :) – DeltaIV

+0

Tout d'abord, excuses, je n'ai pas remarqué que vous étiez l'auteur de la réponse, sinon je vous aurais adressé comme tel. Peut-être avons-nous une terminologie différente pour les fonctions de base. Pour moi, les fonctions de base sont des objets de dimension infinie (fonctions), et votre réponse les montre. Mais les colonnes de la matrice 'b' sont, IMO, pas des fonctions de base, mais les valeurs obtenues par les fonctions de base dans les points d'échantillonnage' x <- c (0.0, 11.0, 17.9, 49.3, 77.4) '. ctd .. – DeltaIV

Répondre

2

La matrice b

#    1   2   3 
# [1,] 0.0000000 0.0000000 0.0000000  
# [2,] 0.8270677 0.0000000 0.0000000  
# [3,] 0.8198433 0.1801567 0.0000000  
# [4,] 0.0000000 0.7286085 0.2713915  
# [5,] 0.0000000 0.0000000 1.0000000 

est en fait la matrice des valeurs des trois fonctions de base à chaque point de x, qui aurait été évident pour moi car il est exactement la même interprétation que pour un polynôme modèle linéaire.En fait, depuis les noeuds limites sont

bknots <- attr(b,"Boundary.knots") 
# [1] 0.0 77.4 

et les nœuds internes sont

iknots <- attr(b,"knots") 
# 33.33333% 66.66667% 
# 13.30000 38.83333 

alors les trois fonctions de base, comme le montre here, sont:

knots <- c(bknots[1],iknots,bknots[2]) 
y1 <- c(0,1,0,0) 
y2 <- c(0,0,1,0) 
y3 <- c(0,0,0,1) 
par(mfrow = c(1, 3)) 
plot(knots, y1, type = "l", main = "basis 1: b1") 
plot(knots, y2, type = "l", main = "basis 2: b2") 
plot(knots, b3, type = "l", main = "basis 3: b3") 

enter image description here

Maintenant, considérez b[,1]

#    1 
# [1,] 0.0000000 
# [2,] 0.8270677 
# [3,] 0.8198433 
# [4,] 0.0000000 
# [5,] 0.0000000 

Ceux-ci doivent être les valeurs de b1 dans x <- c(0.0, 11.0, 17.9, 49.3, 77.4). En fait, b1 est 0 dans knots[1] = 0 et 1 dans knots[2] = 13.3000, ce qui signifie que dans x[2] (11.0) la valeur doit être 11/13.3 = 0.8270677, comme prévu. De même, puisque b1 est 0 pour knots[3] = 38.83333, la valeur dans x[3] (17,9) doit être (38.83333-13.3)/17.9 = 0.8198433. Puisque x[4], x[5] > knots[3] = 38.83333, b1 est 0 là. Une interprétation similaire peut être donnée pour les deux autres colonnes.