拟合多项式

Fitting a polynomial

我想计算多项式的拟合值。

我想计算 'fit' 但不调整变量 'z'。

我现在的东西很麻烦,最终我想遍历不同的幂多项式,而不必每次都在上面的方程中添加一项 'fit'。


x <- runif(n = 50, min = 1, max = 10)
y <- runif(n = 50, min = 10, max = 20)
z <- sample(letters[1:5], 50, TRUE)

f <- lm(y ~ poly(x, 5, raw=TRUE) + as.factor(z), na.action=na.exclude)

fit <- f$coeff[1] + f$coeff[2]*x + f$coeff[3]*x^2 + f$coeff[4]*x^3 + 
  f$coeff[5]*x^4 + 
  f$coeff[6]*x^5

默认情况下,R 用于拟合因子的参数化是为除第一个级别之外的所有级别添加虚拟变量。因此,如果您希望数据的预测排除因子 z 的系数,只需要求预测 x 取真值,而 z 取第一级(在你的情况下可能 "a",但采样可能永远不会给出 "a",所以最好使用 levels(as.factor(z))[1].

即:

newdata <- data.frame(x = x, z = levels(as.factor(z))[1])
fit <- predict(f, newdata = newdata)

我有点担心在 newdata 中计算 as.factor() 时可能会出现问题(尽管它似乎给出与您的公式相同的值),所以我建议稍微不同的总体方法:将 z 更改为之前的一个因素 呼叫 lm()。也就是说,

z <- as.factor(z)
f <- lm(y ~ poly(x, 5, raw=TRUE) + z, na.action=na.exclude)
levs <- levels(z)
newdata <- data.frame(x = x, z = factor(levs[1], levels = levs))
fit <- predict(f, newdata = newdata)