我正在使用R中的lda函数来拟合模型。在拟合模型后,我想使用拟合来放入计算机程序中,根据输入进行分类。我只看到线性判别式和群均值的系数。我想我需要截距和系数来得到每组的实际分数。
简单的答案是:
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)
scale
中的x
自变量可以是原始数据,也可以是任何想要投影(预测(到拟合判别空间中的新数据。然而,总是必须使用由原始数据定义的居中矢量(用于LDA模型拟合,在我们的示例中为center
(来相应地居中新数据。
4(将中心数据与存储在$scaling
中的LD系数(=载荷(相乘,得到实际得分
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`)
R返回的信息比它在控制台上打印的信息多。总是阅读功能的手册页,例如lda
,以查看";值";部分。";另见";部分通常列出其他可能有用的函数。以下是一个使用包含在R:中的iris
数据集的简单示例
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个错误。两个云芝标本被归类为弗吉尼亚,一个弗吉尼亚标本被归类于云芝。