我试图计算线性回归的残差与自变量p
之间的相关系数。
基本上,线性回归估计当前销售额是当前价格p
和过去价格p1
的函数。
当前价格mydf$p
的向量长度为8,但残差是长度为7的向量,因为NA
值p1
已删除了一个条目。
# 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”矩阵,但这不起作用。
答案 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)似乎就是你要找的东西 然后,您可以使用[]和列号或名称
选择所需的变量