2012-04-30 4 views
2

Я пытаюсь сделать анализ PCA с помощью функции princomp в R.Omit NA и данные вменение, прежде чем делать анализ PCA с помощью R

Ниже приведен пример кода:

mydf <- data.frame (
    A = c("NA", rnorm(10, 4, 5)), 
    B = c("NA", rnorm(9, 4, 5), "NA"), 
    C = c("NA", "NA", rnorm(8, 4, 5), "NA") 
) 

out <- princomp(mydf, cor = TRUE, na.action=na.exclude) 

Error in cov.wt(z) : 'x' must contain finite values only 

Я попытался удалить NA из набора данных, но это не сработает.

ndnew <- mydf[complete.cases(mydf),] 

        A     B    C 
1     NA     NA    NA 
2 1.67558617743171 1.28714736288378    NA 
3 -1.03388645096478 9.8370942023751 10.9522215389562 
4 7.10494481721949 14.7686678743866 4.06560213642725 
5  13.966212462717 3.92061729913733 7.12875100279949 
6 -1.91566982754146 0.842774330179978 5.26042516598668 
7 0.0974919570675357 5.5264365812476 6.30783046905425 
8 12.7384749395121 4.72439301946042 2.9318845479507 
9 13.1859349108349 -0.546676530952666 9.98938028956806 
10 4.97278207223239 6.95942086859593 5.15901566720956 
11 -4.10115142119221     NA    NA 

Даже если я могу удалить NA «S не может быть помощь, как раз строки или столбца имеет, по меньшей мере, один недостающих значений. Есть ли какой-либо метод R, который может навязывать данные, делающие анализ PCA?


UPDATE: на основе ответов:

> mydf <- data.frame (A = c(NA, rnorm(10, 4, 5)), B = c(NA, rnorm(9, 4, 5), NA), 
+ C = c(NA, NA, rnorm(8, 4, 5), NA)) 
> out <- princomp(mydf, cor = TRUE, na.action=na.exclude) 
Error in cov.wt(z) : 'x' must contain finite values only 

ndnew <- mydf[complete.cases(mydf),] 
out <- princomp(ndnew, cor = TRUE, na.action=na.exclude) 

Это работает, но defult na.action не работает.

Есть ли какой-либо метод, который может навязывать данные, так как в реальных данных у меня есть почти каждый столбец с отсутствующим значением в них? Результат такого пропуска NA даст мне ~ 0 строк или столбцов.

+2

Мой ответ ниже описывает ваш «маленький» вопрос о том, как заставить аргумент 'na.action' работать. Для вашего большого вопроса о том, как действовать, когда ваши данные содержат много NA, быстрый поиск в Google по «недостающим значениям pca» вызывает массу полезных хитов, включая [эту функцию R] {http: //rss.acs.unt .edu/RDoc/библиотека/pcaMethods/HTML/bpca.html}. Если вам все еще нужна помощь после проведения некоторых исследований, я бы перешел к http://stats.stackexchange.com/, так как это действительно статистический вопрос. –

+0

@ JoshO'Brien Спасибо, Джош, я ценю вашу помощь. Я был в тумане по этой проблеме ... теперь у меня есть четкий путь – jon

ответ

6

Для na.action, чтобы иметь эффект, вы должны явно поставить formula аргумент:

princomp(formula = ~., data = mydf, cor = TRUE, na.action=na.exclude) 

# Call: 
# princomp(formula = ~., data = mydf, na.action = na.exclude, cor = TRUE) 
# 
# Standard deviations: 
# Comp.1 Comp.2 Comp.3 
# 1.3748310 0.8887105 0.5657149 

формула необходима, потому что она вызывает отправку princomp.formula, единственный princomp метод, который делает что-нибудь полезное с na.action.

methods('princomp') 
[1] princomp.default* princomp.formula* 

names(formals(stats:::princomp.formula)) 
[1] "formula" "data"  "subset" "na.action" "..." 

names(formals(stats:::princomp.default)) 
[1] "x"  "cor" "scores" "covmat" "subset" "..." 
6

Это потому, что вы использовали символьную версию NA, которая на самом деле не является NA.

Это свидетельствует о том, что я имею в виду:

is.na("NA") 
is.na(NA) 

Я бы зафиксировать его на уровне создания, но вот способ ретро исправить это (потому что вы использовали символ «NA» это делает весь столбец из класс character означает, что вы должны будете установить это с as.numeric а):

FUN <- function(x) as.numeric(ifelse(x=="NA", NA, x)) 
mydf2 <- data.frame(apply(mydf, 2, FUN)) 
ndnew <- mydf[complete.cases(mydf2),] 
ndnew 

, который дает:

    A     B     C 
3 11.3349957691175 6.97143301427903 -2.13578124048775 
4 5.69035783905702 -2.44999550936244 -4.40642099309301 
5 -0.865878644072023 6.03782080227184 9.83402859382248 
6 6.58329959845638 5.67811450593805 12.4477770011262 
7 0.759928613563254 16.6445809805028 9.45835418422973 
8 11.3798459951171 1.36989010500538 0.784492783538675 
9 0.671542080233918 5.9024564388189 16.2389092991422 
10 3.64295741533713 9.78754135462621 -2.4293697924212 

EDIT: ============================================================================================== ===============

"это работает, но defult na.action не работают"

не много о princomp, но это знать работает (не знаю, почему na.action работы функции нет):

out <- princomp(na.omit(mydf), cor = TRUE) 

«Есть ли какой-либо метод, который может испортить данные, так как в реальных данных у меня есть почти каждый столбец с отсутствующим значением в них? результат такого na omit даст мне ~ 0 строк или столбцов "

Это действительно отдельный вопрос из вашего первого, и вы должны начать новую тему после изучения темы по своему усмотрению.

+0

спасибо, это определенно полезно, я думаю, что я заменил пробелы NA, пока экспортировал из excel created CSV. Возможно, это изменило NA на «NA». См. Мой обновленный вопрос – jon

Смежные вопросы