我使用R来创建具有正交多项式的线性回归模型。我的模特是:
fit=lm(log(UFB2_BITRATE_REF3) ~ poly(QPB2_REF3,2) + B2DBSA_REF3,data=UFB)
UFB2_FPS_REF1= 29.98 27.65 26.30 25.69 24.68 23.07 22.96 22.16 21.51 20.75 20.75 26.15 24.59 22.91 21.02 19.59 18.80 18.21 17.07 16.74 15.98 15.80
QPB2_REF1 = 36 34 32 30 28 26 24 22 20 18 16 36 34 32 30 28 26 24 22 20 18 16
B2DBSA_REF1 = DOFFSOFF DOFFSOFF DOFFSOFF DOFFSOFF DOFFSOFF DOFFSOFF DOFFSOFF DOFFSOFF DOFFSOFF DOFFSOFF DOFFSOFF DONSON DONSON DONSON DONSON DONSON DONSON DONSON DONSON DONSON DONSON DONSON
Levels: DOFFSOFF DONSON
相应的摘要是:
Call:
lm(formula = log(UFB2_BITRATE_REF3) ~ poly(QPB2_REF3, 2) + B2DBSA_REF3, data = UFB)
Residuals:
Min 1Q Median 3Q Max
-0.0150795 -0.0058792 0.0006155 0.0049245 0.0120587
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 9.630e+00 3.302e-02 291.62 < 2e-16 ***
poly(QPB2_REF3, 2, raw = T)1 -4.385e-02 2.640e-03 -16.61 2.31e-12 ***
poly(QPB2_REF3, 2, raw = T)2 -1.827e-03 5.047e-05 -36.20 < 2e-16 ***
B2DBSA_REF3DONSON -3.746e-02 3.566e-03 -10.51 4.16e-09 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.008363 on 18 degrees of freedom
Multiple R-squared: 0.9999, Adjusted R-squared: 0.9999
F-statistic: 8.134e+04 on 3 and 18 DF, p-value: < 2.2e-16
接下来,我想为这个模型创建一个函数f(x)= a + bx + cx ^ 2 + ....我想在R中使用Gram Schmidt算法进行qr分解。
你有什么想法吗?提前谢谢!
答案 0 :(得分:2)
我忽略了“我想在R中使用Gram Schmidt算法进行qr分解”,但要注意poly()
使用qr()
来计算其正交多项式。
我把这个问题读作想要用正交多项式poly(QPB2_REF3, 2, raw = FALSE)
的系数取模型,并用QPB2_REF3
的幂代数表示。这意味着正交多项式poly(QPB2_REF3, 2, raw = FALSE)1
,poly(QPB2_REF3, 2, raw = FALSE)2
通常表示为QPB2_REF3
的幂系数,而不是attr(, "coefs")
poly()
中的“居中和归一化常数”对象。
多年来,在各种R论坛中,其他人也提出了类似的要求,可以说: (a)使用poly.predict()计算多项式,因此不需要传统的形式系数; (b)查看代码中的算法和/或Kennedy&amp;温柔(1980年,第343-4页)。
(a)不符合我的教学需要。 在(b)我可以看到如何计算给定x的多项式值,但我在代数中迷失了试图推导出传统形式系数: - {
肯尼迪&amp;温柔地提到“在p(x)中求解x”这对我的简单思想建议lm
,并导致在orth2raw()
下面实现的真正可怕的方法。我完全接受必须有一种更好,更直接的方法来从居中和归一化常数推导出传统的形式系数,但我无法解决这个问题,而且这种方法似乎有效。
orth2raw <- function(x){
# x <- poly(.., raw=FALSE) has a "coefs" attribute "which contains
# the centering and normalization constants used in constructing
# the orthogonal polynomials". orth2raw returns the coefficents of
# those polynomials in the conventional form
# b0.x^0 + b1.x^1 + b2.x^2 + ...
# It handles the coefs list returned by my modifications of
# poly and polym to handle multivariate predictions
o2r <- function(coefs){
Xmean <- coefs$alpha[1]
Xsd <- sqrt(coefs$norm2[3]/coefs$norm2[2])
X <- seq(Xmean-3*Xsd, Xmean+3*Xsd, length.out=degree+1)
Y <- poly(X, degree = degree, coefs=coefs)
Rcoefs <- matrix(0,degree, degree+1)
for (i in 1:degree) Rcoefs[i,1:(i+1)] <- coef(lm(Y[,i] ~ poly(X, i, raw=TRUE) ))
dimnames(Rcoefs) <- list(paste0("poly(x)", 1:degree), paste0("x^",0:degree))
Rcoefs
}
degree <- max(attr(x, "degree"))
coefs <- attr(x, "coefs")
if(is.list(coefs[[1]])) lapply(coefs, o2r) else o2r(coefs)
}