我正在尝试通过使用以下数据集通过r中的主成分分析(pca)运行社会资本数据:https://aese.psu.edu/nercrd/community/social-capital-resources/social-capital-variables-for-2014/social-capital-variables-spreadsheet-for-2014/view
我运行分析很好,但是我需要将因子加载合并到原始数据集中以进行进一步的分析和表示。我只需要知道在运行pca分析时如何保留id变量,以便将它们合并到原始数据集中即可。
我已经标准化了数据,然后运行下面的代码(我从另一个来源收集了代码)。我在美国的每个县的一列中都收到了因子负荷,但是我的问题是我的原始数据库包含每个县的id变量(FIPS代码),但是因子负荷却没有。
calcpc <- function(variables,loadings)
{
# find the number of samples in the data set
as.data.frame(variables)
numsamples <- nrow(variables)
# make a vector to store the component
pc <- numeric(numsamples)
# find the number of variables
numvariables <- length(variables)
# calculate the value of the component for each sample
for (i in 1:numsamples)
{
valuei <- 0
for (j in 1:numvariables)
{
valueij <- variables[i,j]
loadingj <- loadings[j]
valuei <- valuei + (valueij * loadingj)
}
pc[i] <- valuei
}
return(pc)
}
xxx<-calcpc(standardisedconcentrations, socialcapital.pca$rotation[,1])
答案 0 :(得分:0)
假设您将socialcapital.pca
计算为
socialcapital.pca <- prcomp(standardisedconcentrations)
,并且standardisedconcentrations
等于标准化分析变量的顺序与它们在分析数据集中出现的顺序相同,那么您只需附加FIPS代码(作为另一列或一行)名称))到由calcpc()
函数创建的输出PC向量中,因为主成分评分中的行顺序与原始数据中的行顺序相同。
还要注意两件事:
calcpc()
函数内部的两个循环,并通过使用以下矩阵计算来计算PC向量来加快处理速度:pc <- variables %*% loadings
calcpc()
函数的调用方式为:calcpc(standardisedconcentrations, socialcapital.pca$rotation[,1,drop=FALSE])
drop=FALSE
以确保rotation
属性的第一列保留为具有一个列的矩阵。princomp()
函数而不是prcomp()
函数来运行主成分分析,则会直接将主成分或分数作为输出对象的一部分(在属性{{1}中) })。scores
与princomp()
来运行PCA的区别,主要是引用以下文档: 编辑:如下面我的评论所述,您还可以将分析矩阵或数据框的行名属性设置为数据和分析结果中的prcomp()
变量由FIPS
或princomp()
完成的操作将包含这些ID作为行名。
例如:
使用prcomp()
:
princomp()
然后,主成分矩阵rownames(standardisedconcentrations) <- FIPS
socialcapital.pca <- princomp(standardisedconcentrations)
的行名将包含socialcapital.pca$scores
代码。
或使用FIPS
:
prcomp()
然后,rownames(standardisedconcentrations) <- FIPS
socialcapital.pca <- prcomp(standardisedconcentrations)
pc1 <- standardisedconcentrations %*% socialcapital.pca$rotation[,1]
的行名称将包含pc1
代码。