R

沒有乘法誤差的對數轉換數據的回歸模型

  • January 6, 2017

我有一組數據,其中一個解釋變量和一個響應變量。它們都非常偏斜,因此已使用對數進行了轉換以使它們“更正常”。

當我在兩個變量之間創建線性回歸時,擬合非常好(R 平方為 0.85),但是由於使用對數變換的誤差的乘法性質,較大的值在進行反向變換後會被嚴重低估。

以下示例說明了我的意思:

set.seed(10)

x=rlnorm(100,5,1)
y=rlnorm(100,2,2)

x=sort(x, decreasing = FALSE)
y=sort(y, decreasing = FALSE)

DF=data.frame(x=x,y=y)

## Plot relationship between variables
plot(log(y)~log(x))

記錄變量之間的關係。

## Create regression using logged data
fit=lm(log(y)~log(x), data=DF)
summary(fit)

## Plot regression line
plot(log(y)~log(x))
abline(-7.936712,1.990450, col="red")

包括回歸的關係

## Compute predicted y values by back-transforming
DF$Predicted=(exp(-7.936712)*(DF$x^1.990450))

## Calculate sum of actual vs. predicted.
sum(DF$y)
# 4632.657
sum(DF$Predicted)
# 3792.603

## Create model between actual and predicted.
pred_fit=lm(Predicted~y-1, data=DF)
summary(pred_fit)
plot(Predicted~y-1,data=DF)
abline(0,1, col="red")

實際與擬合之間的回歸

有人建議我嘗試其他模型(例如 GLM),但似乎無法準確確定這些模型如何適用。我這樣做的原因是:

  • 一旦應用了響應變量和解釋變量的對數變換,變量之間的關係似乎是線性的。因此,GLM 將受制於高斯族(如果我錯了,請糾正我),因此與我已經擁有的沒有區別。

如果我使用對數鏈接函數將 GLM 應用於未轉換的數據,那麼這會將對數轉換應用於我的響應或解釋變量(或兩者),並且我需要在之後進行反向轉換,就像我一樣與線性模型?

此外,我看不出這是否能解決乘法誤差問題,這是我探索這個問題的動機。最後,我想使用對數刻度在繪圖上查看這個 GLM 的結果,這樣我就可以看到模型對數據的擬合程度。不確定這是否可能,但它可能會幫助我理解。

我在這裡說明了五個適合模型的選項。他們所有人的假設是,這種關係實際上是我們只需要決定合適的錯誤結構。

1.) 首先是 OLS 模型,即反向變換後的乘法誤差。

fit1 <- lm(log(y) ~ log(x), data = DF)

我認為這實際上是一個適當的錯誤模型,因為您顯然會隨著值的增加而增加分散。

2.) 非線性模型,即附加誤差。

fit2 <- nls(y ~ a * x^b, data = DF, start = list(a = exp(coef(fit1)[1]), b = coef(fit1)[2]))

3.) 具有高斯分佈和對數鏈接函數的廣義線性模型。當我們繪製結果時,我們將看到這實際上是與 2 相同的模型。

fit3 <- glm(y ~ log(x), data = DF, family = gaussian(link = "log"))

4.) 非線性模型為 2,但具有方差函數,它增加了一個額外的參數。

library(nlme)
fit4 <- gnls(y ~ a * x^b, params = list(a ~ 1, b ~ 1),
            data = DF, start = list(a = exp(coef(fit1)[1]), b = coef(fit1)[2]), 
            weights = varExp(form = ~ y))

5.) 具有伽馬分佈和日誌鏈接的 GLM。

fit5 <- glm(y ~ log(x), data = DF, family = Gamma(link = "log"))

現在讓我們繪製它們:

plot(y ~ x, data = DF)
curve(exp(predict(fit1, newdata = data.frame(x = x))), col = "green", add = TRUE)
curve(predict(fit2, newdata = data.frame(x = x)), col = "black", add = TRUE)
curve(predict(fit3, newdata = data.frame(x = x), type = "response"), col = "red", add = TRUE, lty = 2)
curve(predict(fit4, newdata = data.frame(x = x)), col = "brown", add = TRUE)
curve(predict(fit5, newdata = data.frame(x = x), type = "response"), col = "cyan", add = TRUE)

legend("topleft", legend = c("OLS", "nls", "Gauss GLM", "weighted nls", "Gamma GLM"),
      col = c("green", "black", "red", "brown", "cyan"),
      lty = c(1, 1, 2, 1, 1))

結果圖

我希望這些擬合能說服您,您實際上應該使用允許較大值的較大方差的模型。甚至我擬合方差模型的模型也同意這一點。如果您使用非線性模型或高斯 GLM,您會過度重視較大的值。

最後,您應該仔細考慮假設的關係是否正確。有科學理論支持嗎?

引用自:https://stats.stackexchange.com/questions/254876

comments powered by Disqus