1

I am using the lda function in R to fit a model. After fitting a model, I would like to use the fits to then put into a computer program to classify based on inputs. I only see the coefficients of linear discriminants and group means. I thought I need the intercept and coefficients to get the actual score for each group.

4

2 回答 2

5

简短的回答是:

iris.lda <- lda(x = iris[, 1:4], grouping = iris$Species)
iris.lda$scores <- predict(iris.lda)$x

确切的过程有点隐藏,getAnywhere(predict.lda)因为该函数需要处理更多的事情,例如在 R 环境中查找原始数据。如果您想了解如何在 R 中或在一张纸上手动执行此操作,则从 LDA 系数获取实际 LDA 分数的过程归结为以下 4 个步骤:

1) 计算每个变量的组均值

# tapply solution  
grmeans <- sapply(1:4, function(x) tapply(iris[,x], INDEX = iris$Species, FUN = mean))

# # dplyr solution
# library(dplyr)
# grmeans <- iris %>% group_by(Species) %>% summarize_all(list(mean))

grmeans 
#            [,1]  [,2]  [,3]  [,4]
#setosa     5.006 3.428 1.462 0.246
#versicolor 5.936 2.770 4.260 1.326
#virginica  6.588 2.974 5.552 2.026

# check group means
iris.lda <- lda(iris[, 1:4], iris$Species)
all.equal(unname(iris.lda$means), unname(grmeans)) # it's the same!
#[1] TRUE

2) 计算每个变量的组均值的平均值

center <- colMeans(grmeans)
# center <- apply(grmeans, 2, mean) # apply solution

center
#[1] 5.843333 3.057333 3.758000 1.199333

3) 将数据集中在组均值的平均值上

iris.c <- scale(x = iris[, 1:4], center = center, scale = FALSE)

in的x参数scale可以是原始数据,也可以是想要投影(预测)到拟合判别空间中的任何新数据。然而,总是必须使用由原始数据(在我们的示例中用于 LDA 模型拟合center)定义的居中向量来相应地居中新数据。

4) 将居中的数据与存储的 LD 系数 (= loadings) 相乘$scaling以获得实际分数

iris.lda <- lda(iris[, 1:4], iris$Species)
iris.lda$scores <- iris.c %*% iris.lda$scaling
# iris.lda$scores <- predict(iris.lda)$x # equivalent
      

最后一步是矩阵乘法,它对应于计算变量项和相关负载(系数)的所有线性组合,如多元线性回归:

# example for the first centered observation (row)
(ex <- iris.c[1,])
#Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
#  -0.7433333    0.4426667   -2.3580000   -0.9993333 

(coef <- iris.lda$scaling[,"LD1"])
#Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
#   0.8293776    1.5344731   -2.2012117   -2.8104603 

(score <-  unname(coef[1] * ex[1] + coef[2] * ex[2] + coef[3] * ex[3] + coef[4] * ex[4])) 
#[1] 8.0618

all.equal(score, unname(iris.lda$scores[1,"LD1"])) # it's the same!
#[1] TRUE

其他 LD 函数的分数以相同的方式计算(在上面的代码中将“LD1”替换为“LD2”等)。

所有这些步骤都由predict.lda函数完成:

all.equal(predict(iris.lda)$x, iris.lda$scores) # it's the same!
#[1] TRUE

摘要:LDA 分数可以使用predict(iris.lda)$x. 它们仅由居中变量(以 为中心$means)和 LDA 系数(载荷,存储在 中$scaling)的线性组合组成。

可以将 LDA 分数视为多元线性回归的拟合值

# y = a + b1*x1 + b2*x2 + ...

在哪里

# y           LDA score (`predict(iris.lda)$x`)
# a = 0       (no intercept since the data is centered)
# b1, b2, ... LDA coefficients (`$scaling`)
# x1, x2, ... centered data (at mean of group `$means`)
于 2021-09-11T00:28:40.803 回答
0

R 返回的信息比它在控制台上打印的信息多。始终阅读函数的手册页,例如lda查看手册页的“值”部分中返回的信息。“另请参阅”部分通常会列出其他可能有用的功能。iris这是一个使用R 中包含的数据集的简单示例:

library(MASS)
data(iris)
iris.lda <- lda(iris[, 1:4], iris$Species)
iris.pred <- predict(iris.lda)
xtabs(~iris$Species+iris.pred$class)
#             iris.pred$class
# iris$Species setosa versicolor virginica
#   setosa         50          0         0
#   versicolor      0         48         2
#   virginica       0          1        49

在 150 个样本中,判别分析仅犯了 3 个错误。两个杂色标本被归类为弗吉尼亚,一个弗吉尼亚标本被归类为杂色。

于 2021-07-08T20:19:46.677 回答