运行因子加载后,如何在r的pca分析中保持id变量?

时间:2019-01-12 19:50:06

标签: r pca

我正在尝试通过使用以下数据集通过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])

1 个答案:

答案 0 :(得分:0)

假设您将socialcapital.pca计算为
socialcapital.pca <- prcomp(standardisedconcentrations)

,并且standardisedconcentrations等于标准化分析变量的顺序与它们在分析数据集中出现的顺序相同,那么您只需附加FIPS代码(作为另一列或一行)名称))到由calcpc()函数创建的输出PC向量中,因为主成分评分中的行顺序与原始数据中的行顺序相同。

还要注意两件事:

  1. 您可以避免calcpc()函数内部的两个循环,并通过使用以下矩阵计算来计算PC向量来加快处理速度:
    pc <- variables %*% loadings
    假设您将calcpc()函数的调用方式为:
    calcpc(standardisedconcentrations, socialcapital.pca$rotation[,1,drop=FALSE])
    我在其中添加了drop=FALSE以确保rotation属性的第一列保留为具有一个列的矩阵。
  2. 如果您调用princomp()函数而不是prcomp()函数来运行主成分分析,则会直接将主成分或分数作为输出对象的一部分(在属性{{1}中) })。
    您只需要了解使用scoresprincomp()来运行PCA的区别,主要是引用以下文档:
    princomp::“请注意,默认计算使用除数N作为协方差矩阵。”
    prcomp:“与princomp不同,使用通常的除数N-1计算方差。”

编辑:如下面我的评论所述,您还可以将分析矩阵或数据框的行名属性设置为数据和分析结果中的prcomp()变量由FIPSprincomp()完成的操作将包含这些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代码。