我尝试使用来自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)
答案 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。