r 从 lm 系数创建函数
r create function from lm coefficients
下面的代码显示了问题。我运行对data.framedf
进行一次四次多项式回归lm
得到model4
。
然后我创建了回归函数 fhat4
。这按预期工作。
我想将其推广到任何多项式的阶数。因此,我使用 poly
创建 modeln
。这匹配 model4
。但是我无法创建适当的函数 fhatn
。也许这与 for 循环有关?
df <- structure(list(x = c(0.3543937637005, 0.674911001464352, 0.21966037643142,
0.14723521983251, 0.36166316177696, 0.975983075099066, 0.539355604210868,
0.294046462047845, 0.853777077747509, 0.634912414476275), y = c(0.0120776002295315,
0.655085238162428, 0.310665819328278, 0.525274415733293, 0.938241509487852,
0.520828885724768, 0.241615766659379, 0.724816955626011, 0.808277940144762,
0.358921303786337)), .Names = c("x", "y"), row.names = c(NA,
-10L), class = "data.frame")
#############################################
model4 <- lm(y~x+I(x^2)+I(x^3)+I(x^4), data=df)
fhat4 <- function (x) {
model4$coefficients[1]+
model4$coefficients[2]*x+
model4$coefficients[3]*x^2+
model4$coefficients[4]*x^3+
model4$coefficients[5]*x^4
}
fhat4(2)
#############################################
modeln <- lm(y~poly(x,4,raw=TRUE), data=df)
fhatn <- function (x) {
fn <- 0
for (i in 0:5){
fn <- fn + modeln$coefficients[i+1]*x^i
}
}
fhatn(4)
你的 for
循环应该只从 0 到 4 而不是直到 5。而且你的函数没有 return 任何东西所以你可以在最后添加一个 return(fn)
。
总之,你可以不用任何循环实现同样的功能:
modeln <- lm(y ~ poly(x, 4, raw = TRUE), data = df)
fhatn <- function (x) {
sum(x^(seq_along(coef(modeln)) - 1) * coef(modeln))
}
fhatn(2)
[1] -150.6643
请注意 coef(modeln)
是 modeln$coefficients
的替代方法。
或者正如文森特在评论中所说,您可以使用预测功能:
predict(modeln, newdata = data.frame(x = 2))
-150.6643
下面的代码显示了问题。我运行对data.framedf
进行一次四次多项式回归lm
得到model4
。
然后我创建了回归函数 fhat4
。这按预期工作。
我想将其推广到任何多项式的阶数。因此,我使用 poly
创建 modeln
。这匹配 model4
。但是我无法创建适当的函数 fhatn
。也许这与 for 循环有关?
df <- structure(list(x = c(0.3543937637005, 0.674911001464352, 0.21966037643142,
0.14723521983251, 0.36166316177696, 0.975983075099066, 0.539355604210868,
0.294046462047845, 0.853777077747509, 0.634912414476275), y = c(0.0120776002295315,
0.655085238162428, 0.310665819328278, 0.525274415733293, 0.938241509487852,
0.520828885724768, 0.241615766659379, 0.724816955626011, 0.808277940144762,
0.358921303786337)), .Names = c("x", "y"), row.names = c(NA,
-10L), class = "data.frame")
#############################################
model4 <- lm(y~x+I(x^2)+I(x^3)+I(x^4), data=df)
fhat4 <- function (x) {
model4$coefficients[1]+
model4$coefficients[2]*x+
model4$coefficients[3]*x^2+
model4$coefficients[4]*x^3+
model4$coefficients[5]*x^4
}
fhat4(2)
#############################################
modeln <- lm(y~poly(x,4,raw=TRUE), data=df)
fhatn <- function (x) {
fn <- 0
for (i in 0:5){
fn <- fn + modeln$coefficients[i+1]*x^i
}
}
fhatn(4)
你的 for
循环应该只从 0 到 4 而不是直到 5。而且你的函数没有 return 任何东西所以你可以在最后添加一个 return(fn)
。
总之,你可以不用任何循环实现同样的功能:
modeln <- lm(y ~ poly(x, 4, raw = TRUE), data = df)
fhatn <- function (x) {
sum(x^(seq_along(coef(modeln)) - 1) * coef(modeln))
}
fhatn(2)
[1] -150.6643
请注意 coef(modeln)
是 modeln$coefficients
的替代方法。
或者正如文森特在评论中所说,您可以使用预测功能:
predict(modeln, newdata = data.frame(x = 2))
-150.6643