【问题标题】:Eigenvalues computed from R different from other statistical packages and literature results从 R 计算的特征值不同于其他统计包和文献结果
【发布时间】:2013-06-14 04:46:31
【问题描述】:

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

data(longley)
x<-as.matrix(longley[,-7])
e<-eigen(t(x)%*%x)

以下是R语言的结果

$values
[1] 6.665299e+07 2.090730e+05 1.053550e+05 1.803976e+04 2.455730e+01
[6] 2.015117e+00

以下是SPSS的结果

6.861392768154346
0.08210250361264278
0.04568078445788493
0.01068846567618869
1.29228130384155E-4
6.2463047077443345E-6
3.663846498908749E-9

可能的命令错误是什么? 还指导我如何计算比例解释变化。

【问题讨论】:

  • 为什么 R 和 SPSS 给出不同数量的特征值?
  • 这就是为什么 R 和 SPSS 对相同数据给出不同结果的问题。
  • 为什么不准确地展示您在 SPSS 中所做的事情,就像您在 R 中所做的那样。这可能会有所帮助。
  • 我不知道为什么其他人都试图将问题标记为无用或投反对票,因为声誉低下。这是两个软件之间的关键区别,应该讨论和解决。
  • SPSS 有语法,只需粘贴任何命令的语法。关于不同变量的注释是相关的,您的 R 代码仅返回 6 个特征值,而 SPSS 返回 7。您使用了不同的变量(当不包括 SPSS 代码时,任何人都不可能知道),或者矩阵是病态的(程序之间的差异不会出乎意料)。

标签: r spss eigenvalue


【解决方案1】:

对于通过特征值进行共线性诊断,应将包括截距在内的 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) 

得到的值现在不仅与文献匹配,而且与其他软件匹配。

【讨论】:

  • 这是一个合理的答案,但我不禁认为你的原始答案很不清楚——你实际上并没有告诉我们 SPSS 正在缩放 X 矩阵,只是特征值不同(并且您提供了 7 个而不是 6 个特征值)。这使得这更像是一个“阅读文档”的问题,而不是一个编程问题......
  • @Ben Bolker:实际上问题在于,在 R 教程中,共线性诊断由以下命令 eigen(t(X)%*%X) 描述。在我第一次表演时,在 Faraway 的电子书“Practical Regression and using R”中进行了讨论。你可以看到这本书的第 110 页。与共线性诊断技术的文献相比,报告了 6 个特征值,所有这些特征值都是错误的。感谢患者。
【解决方案2】:

这个“答案”实际上只是一个长评论。

这里是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])

【讨论】:

  • 不确定您的意思:longley[ , -7] 有六列。打印时,您会看到一个额外的列,即行名。
  • IN 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:我的意思是文本显示显示七列数字,仅此而已。是的,第一列就是行名。
  • 以下是 Faraway-PRA 电子书数据的结果(longley) xe
猜你喜欢
  • 2019-05-23
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多