获得标准化残差和"剩余的vs.嵌合"情节" mlm"来自`lm()`的对象

时间:2016-09-18 21:00:19

标签: r regression linear-regression lm mlm

set.seed(0)
## 2 response of 10 observations each
response <- matrix(rnorm(20), 10, 2)
## 3 covariates with 10 observations each
predictors <- matrix(rnorm(30), 10, 3)
fit <- lm(response ~ predictors)

我使用以下方法为整个模型生成残差图:

plot(fitted(fit),residuals(fit))

但是,我想为每个预测变量协变量制作单独的图。我可以一次做一个:

f <- fitted(fit)
r <- residual(fit)
plot(f[,1],r[,1])

然而,这种方法的问题在于需要对具有更多预测变量协变量的数据集进行推广。是否有一种方法可以在迭代(f)和(r)的每一列时使用绘图?或者plot()是否可以按颜色对每个协变量进行分组?

2 个答案:

答案 0 :(得分:2)

确保您使用的是标准化残差而不是原始残差

我经常看到plot(fitted(fit), residuals(fit)),但这在统计上是错误的。我们使用plot(fit)生成诊断图,因为我们需要标准化残差而不是原始残差。阅读?plot.lm了解更多信息。但是“mlm”的plot方法支持不足:

plot(fit)
# Error: 'plot.mlm' is not implemented yet

为“mlm”定义“rstandard”S3方法

plot.mlm由于多种原因而不受支持,其中一个原因是缺少rstandard.mlm。对于“lm”和“glm”类,有一个通用的S3方法“rstandard”来获得标准化残差:

methods(rstandard)
# [1] rstandard.glm* rstandard.lm*

不支持“mlm”。所以我们先填补这个空白。

获得标准化残差并不困难。设hii为hat矩阵的对角线,残差的逐点估计标准误差为sqrt(1 - hii) * sigma,其中sigma = sqrt(RSS / df.residual)为估计残差标准误差。 RSS是剩余的平方和; df.residual是剩余的自由度。

hii可以从模型矩阵的QR因子分解的矩阵因子Q计算:rowSums(Q ^ 2)。对于“mlm”,只有一个QR分解,因为模型矩阵对于所有响应都是相同的,因此我们只需要计算hii一次。

不同的回复具有不同的sigma,但它们优雅colSums(residuals(fit) ^ 2) / df.residual(fit)

现在,让我们结束这些想法,为“mlm”获取我们自己的“rstandard”方法:

## define our own "rstandard" method for "mlm" class
rstandard.mlm <- function (model) {
  Q <- with(model, qr.qy(qr, diag(1, nrow = nrow(qr$qr), ncol = qr$rank)))  ## Q matrix
  hii <- rowSums(Q ^ 2)  ## diagonal of hat matrix QQ'
  RSS <- colSums(model$residuals ^ 2)  ## residual sums of squares (for each model)
  sigma <- sqrt(RSS / model$df.residual)  ##  ## Pearson estimate of residuals (for each model)
  pointwise_sd <- outer(sqrt(1 - hii), sigma)  ## point-wise residual standard error (for each model)
  model$residuals / pointwise_sd  ## standardised residuals
  }

注意在函数名中使用.mlm来告诉R这是与S3方法相关联的。一旦我们定义了这个函数,我们就可以在“rstandard”方法中看到它:

## now there are method for "mlm"
methods(rstandard)
# [1] rstandard.glm* rstandard.lm*  rstandard.mlm

要调用此函数,我们不必显式调用rstandard.mlm;调用rstandard就足够了:

## test with your fitted model `fit`
rstandard(fit)
#          [,1]       [,2]
#1   1.56221865  2.6593505
#2  -0.98791320 -1.9344546
#3   0.06042529 -0.4858276
#4   0.18713629  2.9814135
#5   0.11277397  1.4336484
#6  -0.74289985 -2.4452868
#7   0.03690363  0.7015916
#8  -1.58940448 -1.2850961
#9   0.38504435  1.3907223
#10  1.34618139 -1.5900891

标准化残差分布为N(0, 1)

获取残差vs适合“mlm”

的情节

您的初步尝试:

f <- fitted(fit); r <- rstandard(fit); plot(f, r)

不是一个坏主意,前提是可以相互识别不同模型的点。因此,我们可以尝试为不同的模型使用不同的点颜色:

plot(f, r, col = as.numeric(col(f)), pch = 19)

colpchcex等图形参数可以进行矢量输入。我要求plotcol = j用于r[,j] ~ f[,j]j = 1, 2,..., ncol(f)。阅读?par的{​​{1}}的“颜色规范”。 col = j告诉pch = 19绘制实心圆点。阅读basic graphcial parameters以了解各种选择。

最后你可能想要一个传奇。你可以做到

plot

为了为图例框留出空间,我们稍稍延伸plot(f, r, col = as.numeric(col(f)), pch = 19, ylim = c(-3, 4)) legend("topleft", legend = paste0("response ", 1:ncol(f)), pch = 19, col = 1:ncol(f), text.col = 1:ncol(f)) 。标准化残差为ylimN(0,1)是一个很好的范围。如果我们想要将图例框放在左上角,我们会将ylim = c(-3, 3)扩展为ylim。您可以通过c(-3, 4)ncol

自定义您的图例

enter image description here

您有多少回复?

如果您的回复不多,则上述建议很有效。如果你有足够的,建议在单独的情节中绘制它们。您发现的title循环是不错的,除了您需要将绘图区域拆分为不同的子图,可能使用for。如果采用这种方法,还可以设置内边距par(mfrow = c(?, ?))和外边距mar。您可以阅读How to produce a nicer plot for my categorical time series data in a matrix?这样做的一个例子。

如果您有更多回复,您可能想要两者兼而有之?假设您有42个回复,则可以oma,然后在每个子图中绘制7个回复。现在解决方案更基于意见。

答案 1 :(得分:-1)

这就是我解决它的方法。

for(i in 1:ncol(f)) {
    plot(f[,i],r[,i])
}

介意。