考虑以下R代码(我认为最终会调用一些Fortran):
X <- 1:1000
Y <- rep(1,1000)
summary(lm(Y~X))
为什么值会通过摘要返回?这个模型不应该适合,因为Y没有变化吗?更重要的是,为什么模型R ^ 2~ = .5?
修改
我跟踪了从lm到lm.fit的代码,可以看到这个调用:
z <- .Fortran("dqrls", qr = x, n = n, p = p, y = y, ny = ny,
tol = as.double(tol), coefficients = mat.or.vec(p, ny), residuals = y,
effects = y, rank = integer(1L), pivot = 1L:p, qraux = double(p),
work = double(2 * p), PACKAGE = "base")
这就是实际情况似乎发生的地方。看http://svn.r-project.org/R/trunk/src/appl/dqrls.f)并没有帮助我理解发生了什么,因为我不知道fortran。
答案 0 :(得分:5)
从统计学上讲,我们应该期待什么(我想说“期待”,但这是一个非常具体的术语;-))?系数应为(0,1),而不是“不适合”。假设(X,Y)的协方差与X的方差成比例,而不是相反。由于X具有非零方差,因此没有问题。由于协方差为0,X的估计系数应为0.因此,在机器容差范围内,这就是您得到的答案。
这里没有统计异常。可能存在统计上的误解。还存在机器容差问题,但考虑到预测器和响应值的大小,1E-19数量级的系数可以忽略不计。
更新1:可以在this Wikipedia page上找到简单线性回归的快速回顾。需要注意的关键是Var(x)
在分母中,Cov(x,y)
在分子中。在这种情况下,分子为0,分母不为零,因此没有理由期望NaN
或NA
。但是,有人可能会问为什么不是x
a 0
的结果系数,这与QR分解的数值精度问题有关。
答案 1 :(得分:2)
我认为这只是因为QR分解是通过浮点运算实现的。
singular.ok
参数实际上是指设计矩阵(即仅X)。尝试
lm.fit(cbind(X, X), Y)
VS。
lm.fit(cbind(X, X), Y, singular.ok=F)
答案 2 :(得分:2)
我同意问题可能是浮点问题。但我不认为是奇点。
如果您使用solve(t(x1)%*%x1)%*%(t(x1)%*%Y)
而非QR检查,则(t(x1)%*%x1)
不是单数
使用x1 = cbind(rep(1,1000,X)
因为lm(Y~X)
包含截距。