mnm*_*mnm 5 r cluster-analysis pca feature-selection unsupervised-learning
给定一个包含混合变量(即类别变量和连续变量)的数据框,
digits = 0:9
# set seed for reproducibility
set.seed(17)
# function to create random string
createRandString <- function(n = 5000) {
a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}
df <- data.frame(ID=c(1:10), name=sample(letters[1:10]),
studLoc=sample(createRandString(10)),
finalmark=sample(c(0:100),10),
subj1mark=sample(c(0:100),10),subj2mark=sample(c(0:100),10)
)
Run Code Online (Sandbox Code Playgroud)
我使用软件包执行无监督功能选择 FactoMineR
df.princomp <- FactoMineR::FAMD(df, graph = FALSE)
Run Code Online (Sandbox Code Playgroud)
该变量df.princomp是一个列表。
之后,为了可视化我使用fviz_screeplot()和fviz_contrib()喜欢的主要成分
,
#library(factoextra)
factoextra::fviz_screeplot(df.princomp, addlabels = TRUE,
barfill = "gray", barcolor = "black",
ylim = c(0, 50), xlab = "Principal Component",
ylab = "Percentage of explained variance",
main = "Principal Component (PC) for mixed variables")
factoextra::fviz_contrib(df.princomp, choice = "var",
axes = 1, top = 10, sort.val = c("desc"))
Run Code Online (Sandbox Code Playgroud)
这给出了下面的图1
和图2
图1的说明:图1是碎石图。Scree图是一个简单的线段图,显示了每个主成分(PC)解释或表示的数据中总方差的分数。因此,我们可以看到前三个PC共同负责43.8%总方差。现在自然会产生一个问题,“这些变量是什么?”。我在图2中显示了这一点。
图2的说明:该图显示了主成分分析(PCA)结果中行/列的贡献。从这里我可以看到变量name,studLoc并且finalMark是可用于进一步分析的最重要的变量。
进一步的分析-在那里我被困在:为了得到上述变量的贡献name,studLoc,finalMark。我用的主成分可变df.princomp(见上文),如df.princomp$quanti.var$contrib[,4]和df.princomp$quali.var$contrib[,2:3]。
我必须手动指定列索引[,2:3]和[,4]。
我想要什么:我想知道如何进行动态列索引分配,这样我就不必[,2:3]在列表中手动编码列索引了df.princomp?
不确定我对你的问题的解释是否正确,如果不正确,请道歉。据我所知,您正在使用 PCA 作为初始工具来向您展示哪些变量在解释数据集时最重要。然后,您想要返回原始数据,快速选择这些变量,而无需每次手动编码,并将它们用于其他一些分析。
如果这是正确的,那么我已经保存了贡献图中的数据,过滤掉了贡献最大的变量,并使用该结果仅包含这些变量创建了一个新的数据框。
digits = 0:9
# set seed for reproducibility
set.seed(17)
# function to create random string
createRandString <- function(n = 5000) {
a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}
df <- data.frame(ID=c(1:10), name=sample(letters[1:10]),
studLoc=sample(createRandString(10)),
finalmark=sample(c(0:100),10),
subj1mark=sample(c(0:100),10),subj2mark=sample(c(0:100),10)
)
df.princomp <- FactoMineR::FAMD(df, graph = FALSE)
factoextra::fviz_screeplot(df.princomp, addlabels = TRUE,
barfill = "gray", barcolor = "black",
ylim = c(0, 50), xlab = "Principal Component",
ylab = "Percentage of explained variance",
main = "Principal Component (PC) for mixed variables")
#find the top contributing variables to the overall variation in the dataset
#here I am choosing the top 10 variables (although we only have 6 in our df).
#note you can specify which axes you want to look at with axes=, you can even do axes=c(1,2)
f<-factoextra::fviz_contrib(df.princomp, choice = "var",
axes = c(1), top = 10, sort.val = c("desc"))
#save data from contribution plot
dat<-f$data
#filter out ID's that are higher than, say, 20
r<-rownames(dat[dat$contrib>20,])
#extract these from your original data frame into a new data frame for further analysis
new<-df[r]
new
#finalmark name studLoc
#1 53 b POTYQ0002N
#2 73 i LWMTW1195I
#3 95 d VTUGO1685F
#4 39 f YCGGS5755N
#5 97 c GOSWE3283C
#6 58 g APBQD6181U
#7 67 a VUJOG1460V
#8 64 h YXOGP1897F
#9 15 j NFUOB6042V
#10 81 e QYTHG0783G
Run Code Online (Sandbox Code Playgroud)
根据您的评论,您说您想要“在 Dim.1 和 Dim.2 中查找值大于 5 的变量并将这些变量保存到新的数据框中”,我会这样做:
#top contributors to both Dim 1 and 2
f<-factoextra::fviz_contrib(df.princomp, choice = "var",
axes = c(1,2), top = 10, sort.val = c("desc"))
#save data from contribution plot
dat<-f$data
#filter out ID's that are higher than 5
r<-rownames(dat[dat$contrib>5,])
#extract these from your original data frame into a new data frame for further analysis
new<-df[r]
new
Run Code Online (Sandbox Code Playgroud)
(这将所有原始变量保留在我们的新数据框中,因为它们对总方差的贡献均超过 5%)
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |