Как сохранить переменную id в анализе pca в r после выполнения загрузок факторов? - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь выполнить данные социального капитала с помощью анализа основных компонентов (pca) в r, используя следующий набор данных: https://aese.psu.edu/nercrd/community/social-capital-resources/social-capital-variables-for-2014/social-capital-variables-spreadsheet-for-2014/view

Я хорошо провожу анализ, но мне нужно объединить загрузки факторов в исходный набор данных для дальнейшего анализа и представления. Мне просто нужно знать, как я могу сохранить переменные id, когда я запускаю анализ pca, чтобы я мог объединить их с исходным набором данных.

Я стандартизировал данные, а затем запустил приведенный ниже код (который я почерпнул из другого источника). Я получаю то, что является факторной загрузкой в ​​одном столбце для каждого округа в Соединенных Штатах, но моя проблема заключается в том, что моя исходная база данных содержит переменные идентификатора для каждого округа (коды 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 голосов
/ 13 января 2019

Если вы вычислили socialcapital.pca как
socialcapital.pca <- prcomp(standardisedconcentrations)

и что standardisedconcentrations равно стандартизированным переменным анализа в том же порядке, в котором они появляются в наборе данных анализа , тогда вы можете просто прикрепить коды FIPS (как другой столбец или как имена строк) к выходной вектор ПК, созданный функцией calcpc(), поскольку порядок строк в оценках основного компонента совпадает с порядком строк в исходных данных.

Также обратите внимание на две вещи:

  1. Вы можете избежать двух циклов внутри функции calcpc() и ускорить процесс, вычислив вектор ПК с использованием следующего матричного вычисления:
    pc <- variables %*% loadings
    при условии, что вы вызываете функцию calcpc() как:
    calcpc(standardisedconcentrations, socialcapital.pca$rotation[,1,drop=FALSE])
    где я добавил drop=FALSE, чтобы убедиться, что первый столбец атрибута rotation сохранен как матрица с одним столбцом.
  2. Если вы вызовете функцию princomp() вместо функции prcomp() для запуска анализа главных компонентов, вы получите главные компоненты или оценки непосредственно как часть выходного объекта (в атрибуте scores).
    Вам просто нужно знать о различиях в работе PCA с использованием princomp() по сравнению с prcomp(), в основном, цитируя документацию:
    princomp:"Обратите внимание, что при расчете по умолчанию для ковариационной матрицы используется делитель N."
    prcomp:"В отличие от princomp, дисперсии вычисляются с помощью обычного делителя N - 1."

РЕДАКТИРОВАТЬ: Как указано в моем комментарии ниже, вы также можете установить для атрибута rownames матрицы анализа или фрейма данных переменную FIPS в ваших данных и результаты анализа, выполненного princomp() или 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 будут содержать коды FIPS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...