[英]Discriminant Analysis with R
我正在使用 R 進行判別分析。代碼如下:
fit <- lda(group~ A+C1_1+C2+D1a_1+D2_1+D3_1+D3_2+D3_3+E1a_1+E1b_1+E1b_2+E2_1+E3_1+E3_2+E3_3+F2+G_1+G_2+G_3+G_4+H1_1+H2a_1+H2b_1+H3_1+H4_1_1+H1_2+H2a_2+H2b_2+ H3_2+H4_1_2+J1_1+J2_1+J3_1+K1a+K2_1+K2_2+K2_3+K2_4,data=data1)
但不幸的是,我收到以下錯誤:
Error in x - group.means[g, ] : non-conformable arrays
這是 str(data1) 輸出:
'data.frame': 210 obs. of 133 variables:
$ A : int 1 1 1 1 1 1 1 2 1 2 ...
$ C1_1 : int 22 29 12 12 25 15 30 20 30 15 ...
$ C2 : int 2 2 2 2 2 2 2 1 2 2 ...
$ D1a_1 : int 40 50 160 15 150 105 150 45 100 80 ...
$ D2_1 : int 100 100 100 100 100 100 100 90 95 100 ...
$ D3_1 : int 5 15 40 10 30 25 30 40 25 60 ...
$ D3_2 : int 10 30 30 15 30 25 60 40 20 10 ...
$ D3_3 : int 10 30 30 10 10 15 10 20 20 30 ...
$ E1a_1 : int 80 25 140 30 150 120 80 30 100 100 ...
$ E1b_1 : int 100 50 50 25 80 70 80 75 10 75 ...
$ E1b_2 : int 0 50 50 75 20 30 20 25 90 25 ...
$ E2_1 : int 20 60 75 70 60 80 75 100 60 80 ...
$ E3_1 : int 5 20 20 5 30 20 25 25 10 30 ...
$ E3_2 : int 10 20 40 15 30 20 50 50 10 30 ...
$ E3_3 : int 10 20 15 10 10 20 25 25 10 40 ...
$ G_1 : int 5 50 20 25 80 10 30 25 35 5 ...
$ G_2 : int 0 10 50 50 10 10 30 30 30 10 ...
$ G_3 : int 90 30 20 25 10 50 5 30 15 80 ...
$ G_4 : int 5 10 10 0 0 30 35 15 20 5 ...
$ H1_1 : int 1 3 3 2 3 2 3 3 2 3 ...
$ H2a_1 : int NA NA NA 1 NA 2 NA NA 1 NA ...
$ H2b_1 : int NA 2 1 NA 2 NA 1 1 NA 1 ...
$ H3_1 : int 2 2 2 2 2 3 3 3 2 2 ...
$ H4_1_1 : int 6 5 7 6 3 6 5 6 5 5 ...
$ J1_1 : int 4 6 4 4 4 4 6 7 3 3 ...
$ J2_1 : int 2 6 5 3 4 4 1 2 3 3 ...
$ J3_1 : int 4 5 3 3 4 4 6 7 3 4 ...
$ K1a : int 2 2 2 2 2 2 2 2 1 1 ...
$ K2_1 : int NA NA NA NA NA NA NA NA 0 0 ...
$ K2_2 : int NA NA NA NA NA NA NA NA 1 0 ...
$ K2_3 : int NA NA NA NA NA NA NA NA 0 1 ...
$ K2_4 : int NA NA NA NA NA NA NA NA 0 0 ...
[list output truncated
]]
其次,誰能告訴我如何獲得判別分析中使用的變量的顯着性水平。
適用於沒有NA
值的隨機生成的數據集:
set.seed(101)
z <- matrix(runif(210*133),nrow=210)
zz <- data.frame(A=sample(1:2,size=210,replace=TRUE),z)
m <- MASS::lda(A~.,data=zz)
如果添加足夠的NA
我可以重現錯誤:
z2 <- z
z2[sample(length(z),size=2000)] <- NA
zz2 <- data.frame(A=sample(1:2,size=210,replace=TRUE),z2)
m <- MASS::lda(A~.,data=zz2)
結果是
Error in x - group.means[g, ] : non-conformable arrays
(如果我淘汰的更少,我會收到關於共線性的警告)
首先,嘗試刪除具有任何NA
值(或具有多個NA
值的變量)的所有變量,看看是否可以使其正常工作。
對於問題的 p 值部分:谷歌搜索“+r MASS lda 判別分析”導致http://www.statmethods.net/advstats/discriminant.html並建議(並提供鏈接)這些 p 值的 MANOVA。
基於一點谷歌搜索,看起來人們通常使用 MANOVA 和 Wilks 的 lambda 在 LDA 的上下文中進行測試:例如, http ://userwww.sfsu.edu/~efc/classes/biol710/discrim/discrim .pdf說
判別函數分析分為兩個步驟:(1)測試一組判別函數的顯着性,以及; (2)分類。 第一步在計算上與 MANOVA 相同。
他們繼續展示了一個使用 Wilks' lambda 的例子,盡管?manova
說 Pillai-Bartlett 測試(這是manova
的默認值)可能更好......無論如何,進行測試非常容易。
> summary(manova(z~zz$A),test="Wilks")
Df Wilks approx F num Df den Df Pr(>F)
zz$A 1 0.38164 0.92587 133 76 0.6545
Residuals 208
這當然不是你所要求的——你問(我認為)與單個變量而不是整體測試相關的顯着性水平。 我可以想象你可以通過適當的多重校正邏輯回歸做一些事情,但這正在變成一個統計而不是 R 問題。 如果您在這里沒有得到任何進一步的答案,您可能會考慮在http://stats.stackexchange.com上提出一個適當重新表述的問題,參考這個問題......
另一個潛在的問題是因為數據集面臨秩不足問題。 也就是說,其中一個類中的某些變量完全相同。
如果我們檢查了“NA”並且沒有,我們還可以運行一個快速測試:
lda(Y ~ Var1, data = Data.Name)
如果它有效,那么我們可以通過更改以下代碼塊中的 varlist 手動找到合適的變量子集:
# a subset of all of your predictors, I recommend start from some simple ones
varlist <- c(1:5, 8:10)
# get the colnames from the data frame
Col.Name <- colnames(Data.Name)[varlist]
# form a formula
fun <- paste("Response ~", paste(as.character(Col.Name), sep = "=", collapse = " + "))
fun <- formula(fun)
# pass it to the lda function
lda(fun, data = Data.Name)
我們剛剛排除的那些變量在至少一個類中應該具有相同的數字,我們可以通過回顧我們的原始數據來檢查它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.