计算线性回归残差与NAs和R中的自变量之间的相关性

时间:2013-12-21 02:30:54

标签: r lm

我试图计算线性回归的残差与自变量p之间的相关系数。

基本上,线性回归估计当前销售额是当前价格p和过去价格p1的函数。 当前价格mydf$p的向量长度为​​8,但残差是长度为7的向量,因为NAp1已删除了一个条目。

# lag vector and pad with NAs
# Source: http://heuristically.wordpress.com/2012/10/29/lag-function-for-data-frames/
lagpad <- function(x, k) {
  if (!is.vector(x)) 
    stop('x must be a vector')
  if (!is.numeric(x)) 
    stop('x must be numeric')
  if (!is.numeric(k))
    stop('k must be numeric')
  if (1 != length(k))
    stop('k must be a single number')
  c(rep(NA, k), x)[1 : length(x)] 
}

mydf <- data.frame(p = c(10, 8, 10, 9, 10, 9, 10, 8))
mydf$p1 <- lagpad(mydf$p,1)
mydf$sales <- with(mydf, 200 - 15 * p + 5 * p1) + rnorm(nrow(mydf), 0,0.13)

model <- lm(data = mydf, formula = 'sales ~ p + p1')

print(summary(model))

print(cor(residuals(model), mydf$p))
# Error in cor(residuals(model), mydf$p) : incompatible dimensions

在这种特殊情况下,使用mydf$p[2:8]代替mydf$p很容易。 但是,通常,在随机位置可能存在多行,然后删除NA。 在删除包含NA的行后,如何访问回归中实际使用的自变量?

我的一次尝试是基于R documentation for lm。我试图通过model[['x']]访问“x”矩阵,但这不起作用。

3 个答案:

答案 0 :(得分:1)

您可以从model$model获取用于拟合模型的实际数据,并从那里获取p列:

cor(residuals(model), model$model$p)

或者,is.na(mydf$p1)会告诉您mydf中哪些行NA列中有p1

cor(residuals(model), mydf$p[!is.na(mydf$p1)])

通常,is.na(x)告诉我们x中的元素是否为NA

> is.na(c(1,2,NA,4,NA,6))
[1] FALSE FALSE  TRUE FALSE  TRUE FALSE

答案 1 :(得分:1)

只有在调用lm时指定x = T时才会创建x矩阵。然后模型$ x将给出x的值(这更像是模型[['x']]的惯用语。

lm通过完全省略缺少值的观察来处理缺失值。也许你想做类似的事情:

cor(residuals(model), mydf$p[!is.na(mydf$p)])

答案 2 :(得分:1)

model.matrix(model)似乎就是你要找的东西 然后,您可以使用[]和列号或名称

选择所需的变量