重新变换线性模型。 R案例研究

时间:2013-08-29 08:47:04

标签: r plot transformation regression linear-regression

假设我有一个非正态分布的响应变量和一个解释变量。让我们先创建这两个变量(用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预测的线以使其适合数据?

2 个答案:

答案 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))

更多信息

如果我误解了你的实施,请纠正我。