我有一个R形式的线性模型
lm(log(num_encounters) ~ log(distance)*sampling_effort, data=df)
我想要解释残差但是让它们恢复到num_encounters的范围。我看过residuals.lm(x, type="working")
和residuals.lm(x, type="response")
,但我不确定它们返回的值。我是否仍然需要使用exp()来获取num_encounters规模上的残值?或者他们已经达到了这个规模?我想在后面的直方图和光栅图中绘制这些绝对值。
编辑: 基本上我的困惑是以下代码导致3个不同的直方图,而我期望前2个相同。
df$predicted <- exp(predict(x, newdata=df))
histogram(df$num_encounters-df$predicted)
histogram(exp(residuals(x, type="response")))
histogram(residuals(x, type="response"))
答案 0 :(得分:1)
我想解释残差,但要把它们恢复到规模 num_encounters。
您可以轻松计算出来:
mod <- lm(log(num_encounters) ~ log(distance)*sampling_effort, data=df)
res <- df$num_encounters - exp(predict(mod))
答案 1 :(得分:0)
另外@Roland建议,这确实是正确和有效的,我的困惑问题只是基本的高中对数代数。
确实,绝对响应残差(在原始因变量的范围内)可以按照@Roland所说的计算
mod <- lm(log(num_encounters) ~ log(distance)*sampling_effort, data=df)
res <- df$num_encounters - exp(predict(mod))
如果要根据模型残差计算它们,则需要将对数减法规则考虑在内。
log(a)-log(b)=log(a/b)
残差是从原始模型计算的。所以在我的例子中,模型预测log(num_encounters)
。所以残差是log(observed)-log(predicted)
。
我想做的是
exp(resid) = exp(log(obs)-log(pred)) = exp(log(obs/pred)) = obs/pred
这显然不是我想要的数字。为了从模型响应残差中获得绝对响应残差,这就是我所需要的。
obs-obs/exp(resid)
所以在R代码中,你也可以这样做:
mod <- lm(log(num_encounters) ~ log(distance)*sampling_effort, data=df)
abs_resid <- df$num_encounters - df$num_encounters/exp(residuals(mod, type="response"))
这导致与@Roland描述的方法相同的数字当然要容易得多。但至少我让我的大脑再次排成一行。