Extracting orthogonal polynomial coefficients from R's poly() function?

前端 未结 2 1008
深忆病人
深忆病人 2020-12-09 16:47

R\'s poly() function produces orthogonal polynomials for data fitting. However, I would like to use the results of the regression outside of R (say in C++), and

2条回答
  •  臣服心动
    2020-12-09 17:36

    The polynomials are defined recursively using the alpha and norm2 coefficients of the poly object you've created. Let's look at an example:

    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
    

    For notation, let's call a_d the element in index d of alpha and let's call n_d the element in index d of norm2. F_d(x) will be the orthogonal polynomial of degree d that is generated. For some base cases we have:

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

    The rest of the polynomials are recursively defined:

    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})
    

    To confirm with 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
    

    The most compact way to export your polynomials to your C++ code would probably be to export attributes(z)$coefs$alpha and attributes(z)$coefs$norm2 and then use the recursive formula in C++ to evaluate your polynomials.

提交回复
热议问题