在使用lda()
完成R中的线性判别分析后,是否有一种方便的方法来提取每个组的classification functions?R中的线性判别分析中的分类函数
从链接,
这些都不是与判别函数相混淆。分类函数可用于确定每种情况最可能属于哪个组。分组功能与分组功能一样多。每个函数允许我们,通过应用下面的公式来计算每一种情况下为每个组类别得分:
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
可以将分类函数从'MASS ::: predict.lda'的代码中提取出来。实际上有三种不同的版本。默认方法是使用“插件”。有一个额外的术语'log(priors)',我没有在上面看到。还有一个取幂步骤,但距离度量应该在凸函数的变换下保持其期望的属性。我认为可能需要这样一个步骤来维护作为结果一部分的$后验矩阵的rowSums == 1。 – 2015-06-19 22:50:31