从R计算的特征值不同于其他统计包和文献结果

从R计算的特征值不同于其他统计包和文献结果,r,spss,eigenvalue,R,Spss,Eigenvalue,我用朗利数据的特征值和向量来检测多重共线性。 当我从SPSS计算特征值时,我发现与R语言不同的特征值。我不知道为什么。我计算了标准X矩阵和实际X矩阵,但结果不匹配 data(longley) x<-as.matrix(longley[,-7]) e<-eigen(t(x)%*%x) 以下是来自SPSS的结果 6.861392768154346 0.08210250361264278 0.04568078445788493 0.01068846567618869 1.29228130

我用朗利数据的特征值和向量来检测多重共线性。 当我从SPSS计算特征值时,我发现与R语言不同的特征值。我不知道为什么。我计算了标准X矩阵和实际X矩阵,但结果不匹配

data(longley)
x<-as.matrix(longley[,-7])
e<-eigen(t(x)%*%x)
以下是来自SPSS的结果

6.861392768154346
0.08210250361264278
0.04568078445788493
0.01068846567618869
1.29228130384155E-4
6.2463047077443345E-6
3.663846498908749E-9
可能的命令错误是什么? 还可以指导我如何计算比例解释变量。

这个“答案”实际上只是一个很长的注释

这里是
longley[,-7]

> longley[,-7]
     GNP.deflator     GNP Unemployed Armed.Forces Population Year
1947         83.0 234.289      235.6        159.0    107.608 1947
1948         88.5 259.426      232.5        145.6    108.632 1948
1949         88.2 258.054      368.2        161.6    109.773 1949
1950         89.5 284.599      335.1        165.0    110.929 1950
1951         96.2 328.975      209.9        309.9    112.075 1951
1952         98.1 346.999      193.2        359.4    113.270 1952
1953         99.0 365.385      187.0        354.7    115.094 1953
1954        100.0 363.112      357.8        335.0    116.219 1954
1955        101.2 397.469      290.4        304.8    117.388 1955
1956        104.6 419.180      282.2        285.7    118.734 1956
1957        108.4 442.769      293.6        279.8    120.445 1957
1958        110.8 444.546      468.1        263.7    121.950 1958
1959        112.6 482.704      381.3        255.2    123.366 1959
1960        114.2 502.601      393.1        251.4    125.368 1960
1961        115.7 518.173      480.6        257.2    127.852 1961
1962        116.9 554.894      400.7        282.7    130.081 1962
这显示了七列,但最后一列只复制了第一列中的索引。我怀疑在SPSS中,您已经处理了所有7列,而在R中,您处理了6列

这只是一个猜测--我没有SPSS,所以我甚至不能尝试复制您的结果

在R中所做的计算只是计算xT*x的特征值,这些值是正确的。在Python中,使用numpy执行相同的计算:

In [5]: x
Out[5]: 
array([[   83.   ,   234.289,   235.6  ,   159.   ,   107.608,  1947.   ],
       [   88.5  ,   259.426,   232.5  ,   145.6  ,   108.632,  1948.   ],
       [   88.2  ,   258.054,   368.2  ,   161.6  ,   109.773,  1949.   ],
       [   89.5  ,   284.599,   335.1  ,   165.   ,   110.929,  1950.   ],
       [   96.2  ,   328.975,   209.9  ,   309.9  ,   112.075,  1951.   ],
       [   98.1  ,   346.999,   193.2  ,   359.4  ,   113.27 ,  1952.   ],
       [   99.   ,   365.385,   187.   ,   354.7  ,   115.094,  1953.   ],
       [  100.   ,   363.112,   357.8  ,   335.   ,   116.219,  1954.   ],
       [  101.2  ,   397.469,   290.4  ,   304.8  ,   117.388,  1955.   ],
       [  104.6  ,   419.18 ,   282.2  ,   285.7  ,   118.734,  1956.   ],
       [  108.4  ,   442.769,   293.6  ,   279.8  ,   120.445,  1957.   ],
       [  110.8  ,   444.546,   468.1  ,   263.7  ,   121.95 ,  1958.   ],
       [  112.6  ,   482.704,   381.3  ,   255.2  ,   123.366,  1959.   ],
       [  114.2  ,   502.601,   393.1  ,   251.4  ,   125.368,  1960.   ],
       [  115.7  ,   518.173,   480.6  ,   257.2  ,   127.852,  1961.   ],
       [  116.9  ,   554.894,   400.7  ,   282.7  ,   130.081,  1962.   ]])

In [6]: eigvals(x.T.dot(x))
Out[6]: 
array([  6.66529929e+07,   2.09072969e+05,   1.05355048e+05,
         1.80397602e+04,   2.45572970e+01,   2.01511742e+00])

对于通过特征值进行的共线诊断,应将X矩阵(包括截距)重新缩放为“通过将每个原始值除以原始矩阵中该列原始值平方和的平方根获得,包括截距值”,然后必须计算特征值

它的R代码是

data (longley) 
X<-as.matrix(cbind(1,longley[,-7])) 
X <- apply(X, 2 , function(x) x/sqrt(sum(x^2))) 
eigen(t(X)%*%X) 
数据(朗利)

为什么R和SPSS给出不同的特征值数?这就是为什么R和SPSS对相同的数据给出不同的结果的问题。为什么你不确切地展示你在SPSS中所做的事情,就像你对R所做的那样。这可能会有所帮助。我不知道为什么为了低声誉,每隔一段时间就试图将这个问题标记为无用或投反对票。这是两个软件之间的关键区别,应该讨论并解决。SPSS有语法,只需从任何命令粘贴语法即可。关于不同变量的注释是相关的,R代码只返回6个特征值,而SPSS返回7个。您使用了不同的变量(不包括SPSS代码时,任何人都不可能知道),或者矩阵是病态的(程序之间的差异不会出乎意料)。不确定您的意思:
longley[,-7]
有六列。打印时,会看到一个额外的列,即行名。在SPSS中,共线诊断是计算出来的。本征值涉及X矩阵,而不是Y和X。另一方面,结果也与已有文献结果不匹配。另一方面,使用所有7个变量也会产生不同的结果,如下所示:6.672135e+07 2.091251e+05 1.053712e+05 1.805698e+04 2.465533e+01 3.196123e+00 1.414497e+00@zelite:我的意思是文本显示显示了七列数字,仅此而已。是的,第一列只是行名。下面是来自遥远的PRA电子书数据(longley)Xe的结果。这是一个合理的答案,但我忍不住认为您的原始答案非常不清楚——您实际上没有告诉我们SPSS正在缩放X矩阵,只是特征值不同(你给出了7个而不是6个特征值)。这使得这更像是一个“阅读文档”问题,而不是一个编程问题…@Ben Bolker:事实上,问题是在R教程中,共线性诊断是由以下命令eigen(t(X)%*%X)描述的。在电子书“实用回归和使用R”正如我第一次执行的那样,对《遥远的距离》进行了讨论。你可以看到本书的第110页。报告了6个特征值,与共线性诊断技术的文献相比,所有这些特征值都是错误的。感谢患者。
data (longley) 
X<-as.matrix(cbind(1,longley[,-7])) 
X <- apply(X, 2 , function(x) x/sqrt(sum(x^2))) 
eigen(t(X)%*%X)