考虑以下R代码:
example <- function(n) {
X <- 1:n
Y <- rep(1,n)
return(lm(Y~X))
}
#(2.13.0, i386-pc-mingw32)
summary(example(7)) #R^2 = .1963
summary(example(62)) #R^2 = .4529
summary(example(4540)) #R^2 = .7832
summary(example(104))) #R^2 = 0
#I did a search for n 6:10000, the result for R^2 is NaN for
#n = 2, 4, 16, 64, 256, 1024, 2085 (not a typo), 4096, 6175 (not a typo), and 8340 (not a typo)
查看http://svn.r-project.org/R/trunk/src/appl/dqrls.f)并没有帮助我了解发生了什么,因为我不知道Fortran。在另一个问题中,有人回答说,X的系数接近但不为0时,应该归因于浮点机公差误差。
当的值coef(example(n))["X"]
接近0 时,会更大。但是...
- 为什么根本没有值?
- (具体地)确定什么?
- 为什么
NaN
结果看似有序发展? - 为什么违反这种进展?
- 这是什么“预期”行为?
注意:7的R ^ 2应该为0.4542,以查看更具建设性的内容。:-)
好吧,公平地讲,用户应该在使用工具之前实际上了解统计方法(不像Excel用户(好的,对不起,不好意思))。由于很明显R ^ 2接近1且误差接近零,因此我们比将NaN值与函数的限制混淆更了解。现在,如果存在R ^ 2发散为ynoise-> 0的问题(例如,用替换上面的Y语句
—
Carl
Y <- rep(1,n)+runif(n)*ynoise
),那将很有趣:-)
@eznme:我认为结果是特定于机器的,或者至少是32或64位的;我有一台32位计算机,其0.1为7,但是我的64位计算机为NaN。有趣的是,在64位计算机上,不是NaN的R ^ 2都非常接近0.5。当我想到它时,这是有道理的,但一开始让我感到惊讶。
—
亚伦(Aaron)
您正在研究双精度舍入误差。看一下系数;例如
—
ub
apply(as.matrix(2:17), 1, function(n){example(n)$coefficients[-1]})
。(我的结果是,在Win 7 x64 Xeon上,范围从-8e-17到+ 3e-16;大约一半是真零。)顺便说一句,Fortran源代码没有帮助:它只是dqrdc的包装;这就是您要查看的代码。
(续)但是,作为用户,选择简历是一个更好的选择,原因很简单,勤奋的统计分析是用户而不是开发人员的责任。如果用户看到相对于RSS幅度的错误,那么他们应该在进一步报告之前进行自己的后处理。在编程方面,我想知道如何尽可能地避免这些数字问题,但是我认为这些问题无法逃脱,这是拥有勤奋的用户和教育他人的重要条件。
—
Iterator