【问题标题】:Discriminant Analysis with R判别分析与 R
【发布时间】:2021-03-02 05:39:21
【问题描述】:

我正在使用 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

]]

其次,谁能告诉我如何获得判别分析中使用的变量的显着性水平。

【问题讨论】:

  • 语法错误:在您的最后一个 data=data1 之前缺少逗号。
  • 对不起安德烈!但是我在这里犯了这个错误。我运行的代码没有这个错误。
  • 请将str(data1)的结果粘贴到您的问题中。
  • 请注意,如果公式包含数据框中的所有变量,您可以说 lda(group~.,data=data1) ... 是否有可能从全局中提取了一个变量的不同版本工作区?
  • @Ben:这不太可能,因为我只使用这个数据集。

标签: r


【解决方案1】:

适用于没有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)

如果我添加足够多的NAs,我可以重现错误:

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 值(或具有多个值的变量)的 所有 变量,看看是否可以使其工作。

对于问题的 p 值部分:谷歌搜索“+r MASS lda 判别分析”会导致 http://www.statmethods.net/advstats/discriminant.html 并建议(并提供链接)这些 p 值的 MANOVA。

根据一些谷歌搜索,看起来人们通常在 LDA 的上下文中使用 MANOVA 和 Wilks 的 lambda 进行测试:例如,http://userwww.sfsu.edu/~efc/classes/biol710/discrim/discrim.pdf

判别函数分析分为两步:(1) 测试 一组判别函数的重要性,以及; (2)分类。首先 step 在计算上与 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 值的 var。
【解决方案2】:

另一个潜在的问题是因为数据集面临秩不足的问题。也就是说,其中一个类中的一些变量是完全相同的。

如果我们检查了“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)

我们刚刚排除的那些变量应该在至少一个类中具有相同的数字,我们可以通过回顾我们的原始数据来检查它。

【讨论】:

  • 很抱歉回答这么老的帖子,以防万一有人遇到和我一样的问题,但数据集中没有 NA。
  • 感谢姜猎人!
猜你喜欢
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2013-06-19
  • 2011-08-03
  • 2018-03-05
  • 2013-12-10
  • 2018-07-08
相关资源
最近更新 更多