假设我有一个非正态分布的响应变量和一个解释变量。让我们先创建这两个变量(用R编码):
set.seed(12)
resp = (rnorm(120)+20)^3.79
expl = rep(c(1,2,3,4),30)
我运行一个线性模型,我意识到残差不是正态分布的。 (我知道运行夏皮罗可能不足以证明残差不是正常分布的,但这不是我的问题)
m1=lm(resp~expl)
shapiro.test(residuals(m1))
0.01794
因此,我想转换我的解释变量(例如,寻找使用Box-Cox的转换)。
m2=lm(resp^(1/3.79)~expl)
shapiro.test(residuals(m2))
0.4945
好的,现在我的残差正常分发它很好!我现在想要对我的数据和模型进行图形表示。但我不想在变换后的形式中绘制我的解释变量,因为我会失去很多直观的含义。所以我这样做:
plot(x=expl,y=resp)
如果我现在要添加模型怎么办?我能做到这一点
abline(m2) # m2 is the model with transformed variable
但当然该行不符合所代表的数据。我能做到这一点:
abline(m1) # m1 is the model with the original variable.
但它不是我为统计数据运行的模型!如何重新转换m2
预测的线以使其适合数据?
答案 0 :(得分:2)
plotexpl <- seq(1,4,length.out=10)
predresp <- predict(m2,newdata=list(expl=plotexpl))
lines(plotexpl, predresp^(3.79))
我不会在这里讨论统计问题(例如,非重要测试并不意味着H0是真的,而且你的模型并不比平均值好。)
答案 1 :(得分:0)
既然您已经提到变换可能基于Box-Cox公式, 我想指出一个你可能想要考虑的问题。
根据论文 Box中的Box-cox变换公式,George E. P。;考克斯,D.R。(1964)。 &#34;转换的分析&#34; ,你的转换实现(如果它是Box-Cox)可能需要稍微编辑。转换的y应该是(y ^(lambda) )-1)/ lambda而不是y ^(lambda)。(实际上,y ^(lambda)被称为Tukey变换,这是另一个不同的变换公式。)
所以,代码应该是:
lambda=3.79
m2=lm(resp^((lambda-1)/lambda)~expl)
shapiro.test(residuals(m2))
在R:中用boxcox()正确实现Box-Cox变换公式 https://www.r-bloggers.com/on-box-cox-transform-in-regression-models/
Box-Cox转换和Tukey转换之间的比较。 http://onlinestatbook.com/2/transformations/box-cox.html
人们还可以在维基百科上找到Box-Cox转换公式: en.wikipedia.org/wiki/Power_transform#Box.E2.80.93Cox_transformation
如果我误解了你的实施,请纠正我。