Извлечь идентификатор из анализа основных компонентов с отсутствующими данными в R

Я провожу анализ основных компонентов в R на векторах с отсутствующими данными. Я хочу извлечь оценку из основного компонента и сопоставить значения с наблюдениями, которые не отсутствуют в исходном кадре, но я не могу понять, как извлекать и сопоставлять правильные идентификаторы. Например:

x1 <- c(1,2,3,NA, 5,6,7)
x2 <- c(7,NA,6,NA, 4,3,2)

frame <- cbind(x1,x2)

pca_ob<- princomp(~frame)
pca_ob$score[,1]

Это дает следующий результат:

    1         3         5         6         7 
  4.273146  2.104705 -0.715732 -2.125950 -3.536168 

Я хотел бы связать pca_ob$score[,1] с исходным фреймом на основе идентификаторов и заполнить остальные NA, чтобы получить следующую матрицу:

    x1 x2 x3
1    1  7  4.273146
2    2  NA NA
3    3  6  2.104705
4    NA NA NA
5    5  4  -0.715732
6    6  3  -2.125950
7    7  2  -3.536168

Это берет вывод первого набора оценок и сопоставляет их с кадром, при этом NA заполняют все места, где нет оценки PCA, и сопоставляются с переменными, для которых есть оценки. Любые мысли? Спасибо.


r pca
person coding_heart    schedule 20.08.2013    source источник
comment
Я вижу, что вы пытаетесь, но все еще не очень понятно, о чем вы спрашиваете. Возможно, если вы предоставили краткий пример ввода и результата, которого хотите достичь. Обычно подпрограммы R PCA возвращают вам матрицу вращения, масштабы и средние значения, которые можно использовать для возврата от ПК к данным или от новых данных к ПК.   -  person Paul    schedule 20.08.2013
comment
Привет, Пол - я только что отредактировал его, так что, надеюсь, это более четко объясняет вопросы. Спасибо   -  person coding_heart    schedule 20.08.2013
comment
Я сделал goodFrame<-na.omit(frame) и получил те же оценки PCA от goodFrame, поэтому R полностью отбрасывает недостающие данные для расчета PCA.   -  person Paul    schedule 20.08.2013
comment
Действительно, так и происходит, что не является проблемой. Я просто хочу перепривязать вектор оценок PCA к векторам с NA, сопоставив их по их идентификатору. В выводе выше вы видите, что PCA выдает значения для элементов 1,3,5,6,7. У меня есть вопрос, как сопоставить их с элементами 1,3,5,6,7 в другом векторе и ввести NA для элементов 2 и 4.   -  person coding_heart    schedule 20.08.2013
comment
К сожалению, то, что должно быть действительно базовым манипулированием данными в R, часто представляет собой лабиринт извилистых маленьких проходов.   -  person Paul    schedule 20.08.2013
comment
@Paul: есть действительно базовая опция манипулирования данными na.action = na.exclude...   -  person cbeleites unhappy with SX    schedule 20.08.2013


Ответы (2)


Это похоже на взлом. Где-то может быть лучшее решение.

Метод здесь состоит в том, чтобы создать новый объект, который изначально заполнен NA, а затем преобразовать имена разреженных данных в числовые индексы и присвоить их.

> p1 <- pca_ob$scores[,1]
> p1
        1         3         5         6         7 
 4.273146  2.104705 -0.715732 -2.125950 -3.536168 
> z<-rep(NA, 7)
> z[as.numeric(names(p1))]<-p1
> z
[1]  4.273146        NA  2.104705        NA -0.715732 -2.125950 -3.536168
person Paul    schedule 20.08.2013

Я думаю, вы ищете na.exclude:

> princomp(~frame, na.action = na.exclude)$scores
     Comp.1      Comp.2
1  4.273146  0.24540178
2        NA          NA
3  2.104705 -0.30036459
4        NA          NA
5 -0.715732 -0.08790757
6 -2.125950  0.01832094
7 -3.536168  0.12454944

Я нашел это на странице справки для na.omit (которая также охватывает другие действия NA), которая связана с описанием аргумента na.action princomp.

person cbeleites unhappy with SX    schedule 20.08.2013
comment
Это весьма полезно, и лучше, чем бороться с грустью. - person Paul; 20.08.2013