R
沒有乘法誤差的對數轉換數據的回歸模型
我有一組數據,其中一個解釋變量和一個響應變量。它們都非常偏斜,因此已使用對數進行了轉換以使它們“更正常”。
當我在兩個變量之間創建線性回歸時,擬合非常好(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,您會過度重視較大的值。
最後,您應該仔細考慮假設的關係是否正確。有科學理論支持嗎?