2016-09-16 118 views
-1

我有一个lm模型在R,我已经训练和序列化。内的功能,其中,I通过作为输入的模型和特征向量(一个单个阵列),我有: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'; 

这将返回错误y_hat !!我知道这是因为这种解决方案的其他作品(输入这个功能仍然是模型(为bytearray)和一个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'; 

我在做什么错?这是同样的非序列化的模型,第一个选项应该给我正确的答案以及...

+0

这是R代码里面?它看起来像半蟒蛇;冒号中的冒号不会以这种方式工作,也不会返回''或'+'。 – alistaire

+0

是的,它是R +伪代码 - 你可以忽略函数声明 实际上 - 这是在Postgres的PL/R函数中,但我不想把重点放在Postgres – strv7

+0

...所以如何伪代码返回结果,正确与否? – alistaire

回答

1

这个问题似乎是使用newdata = as.data.frame.list(feat_vec)。正如您在previous question中所讨论的那样,这会返回丑陋的列名称。当您拨打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 
+0

从Postgres调用R时,我看不到警告消息......但是肯定有错误 – strv7

+0

谢谢你的回答。对此,我真的非常感激。 虽然它仍然不适用于我,但y_hat总是返回相同的结果,而“手动”计算返回正确的预测结果。我不明白为什么:/ 为什么我需要包含col.names?这真的很重要吗? – strv7

+0

使用randomForest解决了我的问题...谢谢!我仍然用lm得到奇怪的行为,但是我很高兴能够与另一个回归模型和完全相同的代码一起工作! – strv7