jon*_*jon 2 r pca dataframe na princomp
我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
我试图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
Run Code Online (Sandbox Code Playgroud)
即使我可以删除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)
Run Code Online (Sandbox Code Playgroud)
这有效,但是这种侮辱na.action不起作用.
是否有任何方法可以归因于数据,因为在实际数据中我几乎每列都缺少值?这种NA遗漏的结果会给我~0行或列.
这是因为你使用的NA字符版本确实不是NA.
这证明了我的意思:
is.na("NA")
is.na(NA)
Run Code Online (Sandbox Code Playgroud)
我会在创建级别修复它,但是这是一种复古修复它的方法(因为你使用了字符"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
Run Code Online (Sandbox Code Playgroud)
产量:
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
Run Code Online (Sandbox Code Playgroud)
编辑:================================================ ==========
"这种方法有效,但是这种行为不起作用"
不太了解princomp,但这有效(不确定为什么函数的na.action没有):
out <- princomp(na.omit(mydf), cor = TRUE)
Run Code Online (Sandbox Code Playgroud)
"有没有任何方法可以归咎于数据,因为在实际数据中我几乎每列都缺少值?这样的遗漏结果会给我~0行或列"
这真的是你的第一个问题,你应该在自己研究一下这个话题之后开始一个新的主题.
对于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
Run Code Online (Sandbox Code Playgroud)
该公式是必需的,因为它触发调度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" "..."
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13903 次 |
| 最近记录: |