【问题标题】:Omit NA and data imputation before doing PCA analysis using R在使用 R 进行 PCA 分析之前省略 NA 和数据插补
【发布时间】:2012-04-30 15:41:33
【问题描述】:

我正在尝试使用 R 中的princomp 函数进行 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,它也可能无济于事,因为每一行或每一列都至少有一个缺失值。是否有任何 R 方法可以对数据进行 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

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

这可行,但默认的na.action 不起作用。

是否有任何方法可以估算数据,因为在实际数据中,我几乎每列都缺少值?这种NA 遗漏的结果会给我〜0行或列。

【问题讨论】:

  • 我在下面的回答解决了您关于如何使 na.action 参数起作用的“小”问题。对于您的大问题,关于当您的数据包含许多 NA 时如何继续,快速谷歌搜索“缺失值 pca”会发现大量有用的点击,包括 [这个 R 函数]{rss.acs.unt.edu/Rdoc/library/pcaMethods/html/bpca.html}。如果您在做一些研究后仍然需要帮助,我会前往 stats.stackexchange.com ,因为这确实是一个统计问题。
  • @JoshO'Brien 谢谢乔希,感谢您的帮助..我在这个问题上一头雾水...现在我有了明确的道路

标签: r dataframe pca na princomp


【解决方案1】:

那是因为你使用了字符版本的 NA,它真的不是 NA。

这说明了我的意思:

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

我会在创建级别修复它,但这里有一种修复方法(因为您使用了字符“NA”,它构成了类 character 的整个列,这意味着您必须使用 @ 修复它987654323@也一样):

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 行或列”

这确实是一个与您的第一个问题不同的问题,您应该在自己研究一下该主题后开始一个新线程。

【讨论】:

  • 谢谢,这绝对有帮助,我想我在从 excel 创建的 csv 导出时用 NA 替换了空格。这可能已将 NA 更改为“NA”。请查看我更新的问题
【解决方案2】:

要使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 的调度,这是唯一一个对na.action 有用的princomp 方法。

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" "..."   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2011-01-12
    • 2012-11-20
    • 1970-01-01
    • 2017-12-27
    • 2011-05-14
    • 2015-03-14
    相关资源
    最近更新 更多