2011-04-12 41 views
8

在使用lda()完成R中的线性判别分析后,是否有一种方便的方法来提取每个组的classification functionsR中的线性判别分析中的分类函数

从链接,

这些都不是与判别函数相混淆。分类函数可用于确定每种情况最可能属于哪个组。分组功能与分组功能一样多。每个函数允许我们,通过应用下面的公式来计算每一种情况下为每个组类别得分:

Si = ci + wi1*x1 + wi2*x2 + ... + wim*xm 

在该式中,下标i表示相应的基团;下标1,2,...,m表示m个变量; ci是第i组的常数,wij是计算第i组分类得分的第j个变量的权重; xj是第j个变量的相应情况的观测值。 Si是最终的分类分数。

我们可以使用分类函数直接计算一些新的观察分类分数。

我可以使用教科书公式从头开始构建它们,但需要重新构建lda分析中的一些中间步骤。是否有办法从lda对象中获取它们?

补充:

除非我还在误解的东西在布兰登的回答(!遗憾的混乱),看来答案是否定的。据推测大多数用户可以从predict()获得他们需要的信息,该信息根据lda()提供分类。

对于教育的原因,不是认真的研究需要更多的,我也希望看到实际的分类功能,并为后人下面是他们追加到lda()结果的函数:

ty.lda <- function(x, groups){ 
    x.lda <- lda(groups ~ ., as.data.frame(x)) 

    gr <- length(unique(groups)) ## groups might be factors or numeric 
    v <- ncol(x) ## variables 
    m <- x.lda$means ## group means 

    w <- array(NA, dim = c(v, v, gr)) 

    for(i in 1:gr){ 
    tmp <- scale(subset(x, groups == unique(groups)[i]), scale = FALSE) 
    w[,,i] <- t(tmp) %*% tmp 
    } 

    W <- w[,,1] 
    for(i in 2:gr) 
    W <- W + w[,,i] 

    V <- W/(nrow(x) - gr) 
    iV <- solve(V) 

    class.funs <- matrix(NA, nrow = v + 1, ncol = gr) 
    colnames(class.funs) <- paste("group", 1:gr, sep=".") 
    rownames(class.funs) <- c("constant", paste("var", 1:v, sep = ".")) 

    for(i in 1:gr) { 
    class.funs[1, i] <- -0.5 * t(m[i,]) %*% iV %*% (m[i,]) 
    class.funs[2:(v+1) ,i] <- iV %*% (m[i,]) 
    } 

    x.lda$class.funs <- class.funs 

    return(x.lda) 
} 

此代码如下公式在勒让德和勒让德数值生态学(1998年),625页,以及相匹配的工作例子的结果,从页面上626

+0

可以将分类函数从'MASS ::: predict.lda'的代码中提取出来。实际上有三种不同的版本。默认方法是使用“插件”。有一个额外的术语'log(priors)',我没有在上面看到。还有一个取幂步骤,但距离度量应该在凸函数的变换下保持其期望的属性。我认为可能需要这样一个步骤来维护作为结果一部分的$后验矩阵的rowSums == 1。 – 2015-06-19 22:50:31

回答

1

假定x是你的LDA对象:

x$terms 

你可以看它有在对象峰值的结构:

str(x) 

更新:

Iris <- data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]),Sp = rep(c("s","c","v"), rep(50,3))) 
train <- sample(1:150, 75) 
table(Iris$Sp[train]) 
z <- lda(Sp ~ ., Iris, prior = c(1,1,1)/3, subset = train) 
predict(z, Iris[-train, ])$class 
str(z) 
List of 10 
$ prior : Named num [1:3] 0.333 0.333 0.333 
    ..- attr(*, "names")= chr [1:3] "c" "s" "v" 
$ counts : Named int [1:3] 30 25 20 
    ..- attr(*, "names")= chr [1:3] "c" "s" "v" 
$ means : num [1:3, 1:4] 6.03 5.02 6.72 2.81 3.43 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:3] "c" "s" "v" 
    .. ..$ : chr [1:4] "Sepal.L." "Sepal.W." "Petal.L." "Petal.W." 
$ scaling: num [1:4, 1:2] 0.545 1.655 -1.609 -3.682 -0.443 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:4] "Sepal.L." "Sepal.W." "Petal.L." "Petal.W." 
    .. ..$ : chr [1:2] "LD1" "LD2" 
$ lev : chr [1:3] "c" "s" "v" 
$ svd : num [1:2] 33.66 2.93 
$ N  : int 75 
$ call : language lda(formula = Sp ~ ., data = Iris, prior = c(1, 1, 1)/3, subset = train) 
$ terms :Classes 'terms', 'formula' length 3 Sp ~ Sepal.L. + Sepal.W. + Petal.L. + Petal.W. 
    .. ..- attr(*, "variables")= language list(Sp, Sepal.L., Sepal.W., Petal.L., Petal.W.) 
    .. ..- attr(*, "factors")= int [1:5, 1:4] 0 1 0 0 0 0 0 1 0 0 ... 
    .. .. ..- attr(*, "dimnames")=List of 2 
    .. .. .. ..$ : chr [1:5] "Sp" "Sepal.L." "Sepal.W." "Petal.L." ... 
    .. .. .. ..$ : chr [1:4] "Sepal.L." "Sepal.W." "Petal.L." "Petal.W." 
    .. ..- attr(*, "term.labels")= chr [1:4] "Sepal.L." "Sepal.W." "Petal.L." "Petal.W." 
    .. ..- attr(*, "order")= int [1:4] 1 1 1 1 
    .. ..- attr(*, "intercept")= int 1 
    .. ..- attr(*, "response")= int 1 
    .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv 
    .. ..- attr(*, "predvars")= language list(Sp, Sepal.L., Sepal.W., Petal.L., Petal.W.) 
    .. ..- attr(*, "dataClasses")= Named chr [1:5] "factor" "numeric" "numeric" "numeric" ... 
    .. .. ..- attr(*, "names")= chr [1:5] "Sp" "Sepal.L." "Sepal.W." "Petal.L." ... 
$ xlevels: Named list() 
- attr(*, "class")= chr "lda" 
+0

我觉得这里缺少一些东西:我的lda对象中没有任何terms元素! – Tyler 2011-04-12 11:33:58

+0

您是否使用MASS软件包中的lda()? – 2011-04-12 16:21:52

+0

是的,没有条件 - str()显示:“before”,“counts”,“means”,“scaling”,“lev”,“svd”,“N”,“call” – Tyler 2011-04-12 18:38:49

0

我觉得你的问题是有缺陷的......好吧,也许不是有缺陷的,但有些误导至少。判别函数是指组之间的距离,因此不存在与单个组相关的函数,而是描述任何两个组质心之间的距离的函数。我只是answered a more recent question,并放置了一个计算使用虹膜数据集的得分函数的例子,并使用它在第2个预测变量图中标记病例。在2组分析的情况下,一个组的功能将大于零,另一个组的功能将小于零。

+0

我没有问过关于判别函数,我问了关于分类函数。它们不是同一件事。请参阅链接了解说明。 – Tyler 2012-12-29 19:26:24

+0

对。分类函数将数据投影到判别函数上,并根据阈值规则进行离散化处理。如果你想知道MASS :: predict.lda是如何实现的,那么加载MASS并输入'getAnywhere(predict.lda)'。 – 2012-12-29 20:14:46

+0

lda中每个组都有一个分类函数,如我提供的链接以及我引用的书中所示。我现在在链接页面中加入了一段引文来澄清,这样我们至少可以确定我们正在争论同一件事。 'predict.lda'提供了应用分类函数的结果,但它并不返回函数本身。这就是我所要求的。我仍然不明白这个问题有什么缺陷或误导。 – Tyler 2012-12-29 23:43:55