R中的相反值

时间:2014-01-17 19:26:42

标签: r pca

我尝试使用来自http://florence.acadiau.ca/collab/hugh_public/images/f/f3/Pca.pdf的代码为Car93数据制作PCA,但我收到了非常奇怪的结果,例如,我收到了

round(loadings(cars.pca)[,1], 3)
     Min.Price              Price          Max.Price           MPG.city 
        -0.005             -0.005             -0.005              0.005 
   MPG.highway         EngineSize         Horsepower                RPM 
         0.005             -0.001             -0.033              0.564 
  Rev.per.mile Fuel.tank.capacity         Passengers             Length 
         0.528             -0.003             -0.001             -0.014 
     Wheelbase              Width        Turn.circle             Weight 
        -0.007             -0.004             -0.003             -0.634 

但我应该收到

 Min.Price              Price          Max.Price           MPG.city 
            0.005             0.005             0.005              -0.005 
       MPG.highway         EngineSize         Horsepower                RPM 
             -0.005             0.001             0.033              -0.564 
      Rev.per.mile Fuel.tank.capacity         Passengers             Length 
             -0.528             0.003             0.001             0.014 
         Wheelbase              Width        Turn.circle             Weight 
            0.007             0.004             0.003             0.634 

我无法理解为什么会发生这种情况...... 我也得到了令人难以置信的总结:

    > summary(cars.pca)
Importance of components:
                            Comp.1      Comp.2       Comp.3       Comp.4
Standard deviation     809.7715704 462.9240342 269.70957406 2.726051e+01
Proportion of Variance   0.6948358   0.2270788   0.07708145 7.874538e-04
Cumulative Proportion    0.6948358   0.9219146   0.99899602 9.997835e-01
                             Comp.5       Comp.6       Comp.7       Comp.8
Standard deviation     9.8543848085 8.3562565211 4.076212e+00 2.657464e+00
Proportion of Variance 0.0001029002 0.0000739913 1.760641e-05 7.483277e-06
Cumulative Proportion  0.9998863744 0.9999603657 9.999780e-01 9.999855e-01
                             Comp.9      Comp.10      Comp.11      Comp.12
Standard deviation     2.463855e+00 1.686161e+00 1.455246e+00 1.131083e+00
Proportion of Variance 6.432611e-06 3.012694e-06 2.244038e-06 1.355645e-06
Cumulative Proportion  9.999919e-01 9.999949e-01 9.999971e-01 9.999985e-01
                            Comp.13      Comp.14      Comp.15      Comp.16
Standard deviation     1.026482e+00 5.249720e-01 2.923534e-01 2.182833e-02
Proportion of Variance 1.116502e-06 2.920313e-07 9.056773e-08 5.048914e-10
Cumulative Proportion  9.999996e-01 9.999999e-01 1.000000e+00 1.000000e+00

有人可以解释为什么会这样吗?可以吗,我的 R 会记住其他数据,并以某种方式使用它们? (几个月前我在另一个代码中使用data<-read.table('C:/Users/Desktop/HPdati/libratable.txt', sep=',', header=TRUE)),它现在可能会影响我的代码吗? 我的代码是:

    library(MASS)

#data(Cars93)
head(Cars93)
keep<-rep(F,ncol(Cars93))
for(i in 1:ncol(Cars93)){
keep[i]<-is.numeric(Cars93[,i])
if (any(is.na(Cars93[,i])))keep[i]<-F
}
cars<-Cars93[,keep]
head(Cars93)
#library(mva)
cars.pca<-princomp(cars)
summary(cars.pca)
round(loadings(cars.pca)[,1],3)
sqrt(apply(cars,2,var))


cars.pca<-princomp(cars,cor=T)
summary(cars.pca)
loadings(cars.pca)[,c(1:2,16)]

cars.projected.data<-predict(cars.pca,newdata=cars)
eqscplot(cars.projected.data[,1:2])
identify(cars.projected.data[,1],cars.projected.data[,2],cars93$Make)

1 个答案:

答案 0 :(得分:0)

mva已存在多年,但现在它的所有功能都包含在包stats中,因此您所指的文本有点陈旧。另外,部分......

keep <- rep(F, ncol(Cars93))
for(i in 1:ncol(Cars93)){
    keep[i] <- is.numeric(Cars93[,i])
    if(any(is.na(Cars93[,i]))) keep[i] <- F
    }

...非常非R-ish,大多数人都会这样做....

keep2 <- sapply(Cars93, function(COL) is.numeric(COL) & !any(is.na(COL)))
# isTRUE(all(keep == keep2)) # yes

但是到了这一点。主成分的符号(如注释中所述)是任意的,因此结果中没有任何异常。实际上,我得到的结果与prcomp符号相反,但与princomp相同(两个函数都执行PCA,但第一个使用特征分解,而另一个使用奇异值)。

您的summary(cars.pca)也难以置信。它为您提供基于协变矩阵的PC差异,而summary(cars.pca, cor=TRUE)将为您提供与引用文本完全相同的结果。

当然,您可以使用F表示FALSE,使用T表示TRUE,但使用TRUE和FALSE更安全。如果随机黑客走进您的计算机并输入类型:

T <- FALSE
F <- TRUE

突然间,基于T == TRUE和F == FALSE的所有代码都被破坏了。 :)你不能用这种方式重新定义TRUE和FALSE。

除了

问:“可以吗,我的R记得其他数据,并以某种方式使用它们?(几个月前,我使用了数据&lt; -read.table('C:/Users/Desktop/HPdati/libratable.txt',我的另一个代码中的sep =',',header = TRUE)),它现在可能会影响我的代码吗?“

答:“不!”