2014-11-04 12 views
9

La funzione poly() di R produce polinomi ortogonali per l'adattamento dei dati. Tuttavia, vorrei usare i risultati della regressione al di fuori di R (diciamo in C++), e non sembra essere un modo per ottenere i coefficienti per ogni polinomio ortogonale.Estrazione di coefficienti polinomiali ortogonali dalla funzione poly() di R?

Nota 1: Non intendo i coefficienti di regressione, ma i coefficienti dei polinomi ortogonali stessi, ad es. il p_i(x) in

y = a0 + a1*p_1(x) + a2*p_2(x) + ... 

Nota 2: So poly(x, n, raw=T) forze poly per tornare polinomi non ortogonali, ma voglio regredire contro polinomi ortogonali, ed è quello che sto cercando.

+0

Puoi aggiungere un [esempio riproducibile] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) con alcuni dati di esempio e mostrare esattamente cosa sei tu? stai cercando di estrarre? – MrFlick

risposta

14

I polinomi sono definiti in modo ricorsivo utilizzando i coefficienti alpha e norm2 dell'oggetto poly che è stato creato. Diamo un'occhiata a un esempio:

z <- poly(1:10, 3) 
attributes(z)$coefs 
# $alpha 
# [1] 5.5 5.5 5.5 
# $norm2 
# [1] 1.0 10.0 82.5 528.0 3088.8 

per la notazione, chiamiamolo a_d l'elemento nell'indice d di alpha e chiamiamolo n_d l'elemento nell'indice d di norm2. F_d(x) sarà il polinomio ortogonale del grado d generato. Per alcuni casi di base abbiamo:

F_0(x) = 1/sqrt(n_2) 
F_1(x) = (x-a_1)/sqrt(n_3) 

Il resto dei polinomi sono ricorsivamente definito:

F_d(x) = [(x-a_d) * sqrt(n_{d+1}) * F_{d-1}(x) - n_{d+1}/sqrt(n_d) * F_{d-2}(x)]/sqrt(n_{d+2}) 

Per confermare con x=2.1:

x <- 2.1 
predict(z, newdata=x) 
#    1   2   3 
# [1,] -0.3743277 0.1440493 0.1890351 
# ... 

a <- attributes(z)$coefs$alpha 
n <- attributes(z)$coefs$norm2 
f0 <- 1/sqrt(n[2]) 
(f1 <- (x-a[1])/sqrt(n[3])) 
# [1] -0.3743277 
(f2 <- ((x-a[2]) * sqrt(n[3]) * f1 - n[3]/sqrt(n[2]) * f0)/sqrt(n[4])) 
# [1] 0.1440493 
(f3 <- ((x-a[3]) * sqrt(n[4]) * f2 - n[4]/sqrt(n[3]) * f1)/sqrt(n[5])) 
# [1] 0.1890351 

Il modo più compatto per esportare i polinomi al tuo codice C++ sarebbe probabilmente quello di esportare attributes(z)$coefs$alpha e attributes(z)$coefs$norm2 e quindi utilizzare la formula ricorsiva in C++ per valutare i tuoi polinomi.

+0

Eccellente - questo è esattamente quello che stavo cercando. Nella documentazione poly(), è stata fatta menzione dell'espressione di ricorsione a 3 termini in Kennedy & Gentle 1980, ma avendo lasciato il mondo accademico, non ho più libero accesso alle pubblicazioni di riviste, inoltre ho pensato che probabilmente ci sarebbe stato un modo facile per fallo in R. Grazie. – Gilead

+3

@Gilead sì, ho visto anche questo riferimento, ma onestamente ho trovato più semplice leggere il [codice sorgente] (https://code.google.com/p/renjin/source/browse/packages/stats/src/ main/R/contr.poly.R? spec = svndfc698cbde95783fac720091933b36557e78e86c & r = dfc698cbde95783fac720091933b36557e78e86c) (righe 110-124) per capirlo. – josliber

Problemi correlati