R中线性判别分析中的分类函数

Tyl*_*ler 9 r classification

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

从链接,

不要将这些与判别函数混淆.分类函数可用于确定每个案例最可能属于哪个组.分组功能与组相同.每个函数允许我们通过应用公式计算每个组的每个案例的分类分数:

Si = ci + wi1*x1 + wi2*x2 + ... + wim*xm
Run Code Online (Sandbox Code Playgroud)

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

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

我可以使用教科书公式从头开始构建它们,但这需要从lda分析重建许多中间步骤.有没有办法从lda对象中获取它们?

添加:

除非我仍然在布兰登的回答中误解了一些事情(对不起这个混乱!),似乎答案是否定的.据推测,大多数用户可以从中获取所需的信息predict(),从而提供基于的分类lda().

Tyl*_*ler 1

没有内置的方法来获取我需要的信息,所以我编写了一个函数来做到这一点:

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)
}
Run Code Online (Sandbox Code Playgroud)

此代码遵循 Legendre 和 Legendre 的数值生态学 (1998) 第 625 页中的公式,并与从第 626 页开始的工作示例的结果相匹配。