R线性模型(lm)用一个数组预测函数
R linear model (lm) predict function with one single array
我在 R 中有一个 lm
模型,我已经对其进行了训练和序列化。在函数内部,我将模型和特征向量(一个单一数组)作为输入传递,我有:
CREATE OR REPLACE FUNCTION lm_predict(
feat_vec float[],
model bytea
)
RETURNS float
AS
$$
#R-code goes here.
mdl <- unserialize(model)
# class(feat_vec) outputs "array"
y_hat <- predict.lm(mdl, newdata = as.data.frame.list(feat_vec))
return (y_hat)
$$ LANGUAGE 'plr';
这个returns错了y_hat
!!我知道这一点是因为其他解决方案有效(此函数的输入仍然是模型(在字节数组中)和一个 feat_vec
(数组)):
CREATE OR REPLACE FUNCTION lm_predict(
feat_vec float[],
model bytea
)
RETURNS float
AS
$$
#R-code goes here.
mdl <- unserialize(model)
coef = mdl$coefficients
y_hat = coef[1] + as.numeric(coef[-1]%*%feat_vec)
return (y_hat)
$$ LANGUAGE 'plr';
我做错了什么??同样是非序列化模型,第一个选项应该也能给我正确答案...
问题似乎出在 newdata = as.data.frame.list(feat_vec)
的使用上。正如您在 中所讨论的,这个 returns 丑陋的列名。当您调用 predict
时,newdata
的列名必须与模型公式中的协变量名称一致。调用 predict
.
时应该会收到一些警告消息
## example data
set.seed(0)
x1 <- runif(20)
x2 <- rnorm(20)
y <- 0.3 * x1 + 0.7 * x2 + rnorm(20, sd = 0.1)
## linear model
model <- lm(y ~ x1 + x2)
## new data
feat_vec <- c(0.4, 0.6)
newdat <- as.data.frame.list(feat_vec)
# X0.4 X0.6
#1 0.4 0.6
## prediction
y_hat <- predict.lm(model, newdata = newdat)
#Warning message:
#'newdata' had 1 row but variables found have 20 rows
你需要的是
newdat <- as.data.frame.list(feat_vec,
col.names = attr(model$terms, "term.labels"))
# x1 x2
#1 0.4 0.6
y_hat <- predict.lm(model, newdata = newdat)
# 1
#0.5192413
这与您可以手动计算的相同:
coef = model$coefficients
unname(coef[1] + sum(coef[-1] * feat_vec))
#[1] 0.5192413
我在 R 中有一个 lm
模型,我已经对其进行了训练和序列化。在函数内部,我将模型和特征向量(一个单一数组)作为输入传递,我有:
CREATE OR REPLACE FUNCTION lm_predict(
feat_vec float[],
model bytea
)
RETURNS float
AS
$$
#R-code goes here.
mdl <- unserialize(model)
# class(feat_vec) outputs "array"
y_hat <- predict.lm(mdl, newdata = as.data.frame.list(feat_vec))
return (y_hat)
$$ LANGUAGE 'plr';
这个returns错了y_hat
!!我知道这一点是因为其他解决方案有效(此函数的输入仍然是模型(在字节数组中)和一个 feat_vec
(数组)):
CREATE OR REPLACE FUNCTION lm_predict(
feat_vec float[],
model bytea
)
RETURNS float
AS
$$
#R-code goes here.
mdl <- unserialize(model)
coef = mdl$coefficients
y_hat = coef[1] + as.numeric(coef[-1]%*%feat_vec)
return (y_hat)
$$ LANGUAGE 'plr';
我做错了什么??同样是非序列化模型,第一个选项应该也能给我正确答案...
问题似乎出在 newdata = as.data.frame.list(feat_vec)
的使用上。正如您在 predict
时,newdata
的列名必须与模型公式中的协变量名称一致。调用 predict
.
## example data
set.seed(0)
x1 <- runif(20)
x2 <- rnorm(20)
y <- 0.3 * x1 + 0.7 * x2 + rnorm(20, sd = 0.1)
## linear model
model <- lm(y ~ x1 + x2)
## new data
feat_vec <- c(0.4, 0.6)
newdat <- as.data.frame.list(feat_vec)
# X0.4 X0.6
#1 0.4 0.6
## prediction
y_hat <- predict.lm(model, newdata = newdat)
#Warning message:
#'newdata' had 1 row but variables found have 20 rows
你需要的是
newdat <- as.data.frame.list(feat_vec,
col.names = attr(model$terms, "term.labels"))
# x1 x2
#1 0.4 0.6
y_hat <- predict.lm(model, newdata = newdat)
# 1
#0.5192413
这与您可以手动计算的相同:
coef = model$coefficients
unname(coef[1] + sum(coef[-1] * feat_vec))
#[1] 0.5192413