我有一个数据集,其中目标变量向左倾斜。当我绘制这个变量的日志的直方图时,这是一个很好的,看起来很正常的分布。所以我相信我应该记录转换它?
我在下面的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()
添加一个参数来告诉它在进行预测之前已经对目标进行了日志转换吗?
答案 0 :(得分:1)
如果您predict()
,它将返回log(目标)的估计值。如果您想要估算目标,则需要将逆变换exp()
应用于预测。预测间隔可能具有有趣的属性。
答案 1 :(得分:1)
这实际上是一个统计问题,而不是真正的编程...
有两个独立且可能存在冲突的问题:
例如,创建具有对数正态扰动的附加数据:
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)$。 (这个
虽然在这里变化不大。)