当使用带有log(target)的模型进行预测时,我是否必须对预测函数进行任何更改?

时间:2016-10-30 00:22:00

标签: r regression

我有一个数据集,其中目标变量向左倾斜。当我绘制这个变量的日志的直方图时,这是一个很好的,看起来很正常的分布。所以我相信我应该记录转换它?

我在下面的my_model中试过了。但是当我通过查看平均绝对误差来评估它时,我发现它是针对非日志转换版本执行的。

my_model <- lm(target ~ ,var1+var2+var3, data=ptrain)
my_model_log <- lm(log(target) ~ ,var1+var2+var3, data=ptrain)

my_predictions <- predict(my_model_log, interval="prediction", newdata=test_submission)

my_predictions在使用日志模型时表现较差。

这是预期的吗?我应该在predict()添加一个参数来告诉它在进行预测之前已经对目标进行了日志转换吗?

2 个答案:

答案 0 :(得分:1)

如果您predict(),它将返回log(目标)的估计值。如果您想要估算目标,则需要将逆变换exp()应用于预测。预测间隔可能具有有趣的属性。

答案 1 :(得分:1)

这实际上是一个统计问题,而不是真正的编程...

有两个独立且可能存在冲突的问题:

  • 您的数据是否正常? (你的看起来更像是log-normal)
  • 你的解释变量是否更适合作为加法或乘法? (在你的情况下,添加剂可能更好)

例如,创建具有对数正态扰动的附加数据:

x1 <- runif(1000)
x2 <- runif(1000)
y <- 10*x1 + 10*x2 + rlnorm(1000, mean=0, sd=1)
dat <- data.frame(y, x1, x2)

模型是加法的(y = x1 + x2),因此您可能只想使用 lm(y~ ...)。但它也有非正常的干扰,所以你可以 想要运行lm(log(y)~ ...)

测试模型:

日志版

m <- lm(log(y)~x1 + x2, data=dat)
mean(abs(dat$y - exp(predict(m) + 0.208^2/2)))
[1] 1.579968

非日志版

m <- lm(y~x1 + x2, data=dat)
mean(abs(dat$y - predict(m)))
[1] 1.198665

似乎在非日志模型中表现更好,尽管有错误 disturbancs因为它得到了 结构正确。

注意我将日志版本预测为exp(predict(m) + sigma^2/2),因为$ E exp(X)= exp(mu + sigma ^ 2)$其中$ X \ sim N(0,sigma ^ 2)$。 (这个 虽然在这里变化不大。)