2017-05-01 82 views
2

所以我一直在通過現有的問題來解決這個問題,但無濟於事。R - 「CAPdiscrim」和「lda」錯誤「變量1在組內」似乎是不變的「

我有一個由個人(117)組成的數據集,每個個人都有來自不同變量(12)的觀察結果,並且由具有8個級別的因子變量分組。

我想根據Anderson和Willis的方法對這些數據的主要座標進行規範分析。我開始使用BiodiversityR :: CAPdiscrim。讓我們先從一些示例數據:

individual <- c(1:30) 
group <- rep(c("a","b","c"), 10) 
Var1 <- rnorm(n = 30, mean = 3.0e-4,sd = 2.0e-6) 
Var2 <- rnorm(n = 30, mean = 2.4e-4,sd = 2.0e-6) 
Var3 <- rnorm(n = 30, mean = 7.0e-6,sd = 9.0e-9) 
Var4 <- rnorm(n = 30, mean = 4.2e-5,sd = 1.0e-6) 
Var5 <- rnorm(n = 30, mean = 1.0e-4,sd = 9.0e-6) 
Var6 <- rnorm(n = 30, mean = 8.0e-5,sd = 1.0e-5) 

df <- data.frame(cbind(individual, group, Var1, Var2, Var3, Var4, Var5, Var6)) 
df$Var1 <- as.numeric(levels(df$Var1))[as.integer(df$Var1)] 
df$Var2 <- as.numeric(levels(df$Var2))[as.integer(df$Var2)] 
df$Var3 <- as.numeric(levels(df$Var3))[as.integer(df$Var3)] 
df$Var4 <- as.numeric(levels(df$Var4))[as.integer(df$Var4)] 
df$Var5 <- as.numeric(levels(df$Var5))[as.integer(df$Var5)] 
df$Var6 <- as.numeric(levels(df$Var6))[as.integer(df$Var6)] 

CAPdiscrim需要以特定格式數據:

vars <- df[3:8] 

現在我們可以對數據

BiodiversityR::CAPdiscrim(vars~group, 
          data = df, 
          dist = "euclidean", 
          axes = 4, 
          m = 0, 
          permutations = 999) 

它返回運行CAPdiscrim

lda.default(x,分組,...)中的錯誤: 變量1似乎組內恆定

我們可以使用nearZeroVar,看看如果這是真的(這似乎是不正確的):

vars_check <- nearZeroVar(vars, saveMetrics = TRUE, names = TRUE) 
vars_check 

    freqRatio percentUnique zeroVar nzv 
Var1   1   100 FALSE FALSE 
Var2   1   100 FALSE FALSE 
Var3   1   100 FALSE FALSE 
Var4   1   100 FALSE FALSE 
Var5   1   100 FALSE FALSE 
Var6   1   100 FALSE FALSE 

現在我看到關於此錯誤的其他問題具體到LDA()和我注意到,CAPdiscrim()調用vegdist(),cmdscale()和LDA(),所以我試圖通過peice的打破這種分析peice的:

dist_matrix <- vegdist(vars, 
         method = "euclidean", 
         binary = FALSE, 
         diag = FALSE, 
         upper = FALSE, 
         na.rm = TRUE) 

PCA_vars <- cmdscale(d = dist_matrix, 
         k = 5, 
         eig = TRUE, 
         add = FALSE, 
         x.ret = FALSE) 

LDA_pldist <- lda(x = PCA_vars$points, 
        grouping = df$group) 

它返回一個非常相似的結果:

錯誤lda.default(X,分組,...): 變量1 2 3 4 5似乎組內是恆定的現在

lda()有一種說法 「TOL」可以使用非常小的數字打交道時消除這種誤差,這樣我就可以做到這一點:

LDA_pldist <- lda(x = PCA_vars$points, 
        grouping = df$group, 
        tol = 1.0e-25) 

這提供了一些輸出,但不包括一些的CAPdiscrim的功能,如允許的功能determi ne通過排列成爲「m」的最佳數字。

任何人都可以建議如何修改公差CAPdiscrim()?或如何執行什麼CAPdiscrim()手動引擎蓋下做這些其他功能?

任何有識之士將不勝感激。

回答

0

我遇到了完全相同的問題。將包更新到BiodiversityR_2.8-3後,錯誤消失。

(使用你提供的數據)

BiodiversityR::CAPdiscrim(vars~group, 
          data = df, 
          dist = "euclidean", 
          axes = 4, 
          m = 0, 
          permutations = 999) 
#Percentage of correct classifications was 26.66667 
#Significance of this percentage was 0.98999 

#Overall classification success (m=1) : 26.6666666666667 percent 
#a (n=10) correct: 10 percent 
#b (n=10) correct: 70 percent 
#c (n=10) correct: 0 percent 
#Warning message: 
#In cmdscale(distmatrix, k = nrow(x) - 1, eig = T, add = add) : 
# only 18 of the first 29 eigenvalues are > 0 
+0

感謝您的更新@ J.Con。我聯繫了作者,他們在更新軟件包的過程中爲我提供了臨時修復。我很高興聽到新的更新也解決了這個問題。 –