3

princompR の関数を使用して PCA 分析を実行しようとしています。

以下はコード例です。

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としても、すべての行または列に少なくとも 1 つの欠損値があるため、役に立たない可能性があります。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

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

これは機能しますが、デフォルトna.actionは機能しません。

実際のデータでは、ほとんどすべての列に欠損値があるため、データを代入できる方法はありますか? このような省略の結果、NA〜0行または列が得られます。

4

2 に答える 2

9

本当は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

編集:============================================== ==========

「これは機能しますが、デフォルトの na.action は機能しません」

princomp についてはよくわかりませんが、これは機能します (なぜ関数の na.action が機能しないのかわかりません):

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

「実際のデータでは、ほとんどすべての列に欠損値があるため、データを代入できる方法はありますか?そのようなnaの省略の結果は、〜0行または列になります」

これは実際には最初の質問とは別の質問であり、自分でトピックを少し調べた後、新しいスレッドを開始する必要があります.

于 2012-04-30T15:46:58.160 に答える
8

効果を得るには、引数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" "..."   
于 2012-04-30T16:12:51.143 に答える