0

我有一个森林多边形数据集,我正在尝试使用混淆矩阵将字段分类与地图分类进行比较。我能找到的唯一一个可以在更大的数据集(超过 2 个分类选项)上运行并且可以比较文本值的包位于“mda”包中。我已经运行了包'mda'并使用了'confusion'的代码。

随包提供的示例是...

data(iris)
irisfit <- fda(Species ~ ., data = iris)
confusion(predict(irisfit, iris), iris$Species)
                 Setosa       Versicolor       Virginica
Setosa            50              0               0
Versicolor         0             48               1
Virginica          0              2              49

attr(, "error"):
[1] 0.02

我简单地运行我的

data(Habitat)
confusion(Habitat$Field,Habitat$Map)

这给了我一个与提供的代码示例类似(但不那么整洁)的混淆矩阵输出。在这一点上,我迷路了。我有 2 个结果。

attr(,"error")
[1] 0.3448276
attr(,"mismatch")
[1] 0.889313

错误我理解,不匹配但是,我似乎在网上或包装随附的文献中找不到任何提示。我怀疑有这么高的“不匹配”值是好的,但我不知道如何解释它。我认为这可能是一个相当具体的问题,也许只能由以前使用过这个包的人来回答,但如果有人知道,或者有如何找到的提示,我将不胜感激。

谢谢,艾登

编辑- 包括我的数据集的剪辑,显示可能不匹配的内容(怀疑这意味着一致的错误分类)。显示最一致的错误分类的剪辑。

structure(list(Field = structure(c(7L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L, 7L, 8L), .Label = c("Black Spruce ", "Clearcut ", 
"Deciduous ", "Jack Pine ", "Lowland Conifer ", "Marshwillow ", 
"Mixed Conifer ", "Open Muskeg ", "Rock ", "Treed Muskeg ", "Upland Conifer ", 
"Young Conifer", "Young Deciduous"), class = "factor"), Map = structure(c(7L, 
7L, 7L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 13L, 13L, 13L, 6L), .Label = c("Black     Spruce", "Clearcut", "Deciduous", "Jack Pine", "Lowland Conifer", "Marshwillow", 
"Mixed Conifer", "Open Muskeg", "Rock", "Treed Muskeg", "Upland Conifer", 
"Young Conifer", "Young Deciduous"), class = "factor")), .Names = c("Field", 
"Map"), row.names = 143:156, class = "data.frame")
4

1 回答 1

1

这似乎意味着变量不共享一组共同的值。如果一个人在预测另一个人,那么它就是在预测不存在的值(或相反)。不匹配似乎是分配了另一个变量水平中不存在的值的案例的比例。

在您发布的 iris 数据集示例中,如果我们为混淆矩阵中的一个变量引入一个新值,我们可以得出相同的输出。由于它们是因子,我们需要首先创建一个新的因子水平。

data(iris)
irisfit <- fda(Species ~ ., data = iris)
iris$Predict<-predict(irisfit, iris)
iris$Predict=factor(iris$Predict,levels= c("setosa", "versicolor",
      "virginica","monsterosa"))  #adding a new level 'monsterosa'
iris$Predict[1]<-"monsterosa"  #assign it to one of the observations

现在我们可以重新运行混淆函数并得到不匹配:

confusion(iris$Predict, iris$Species)
            true
predicted    setosa versicolor virginica
  setosa         49          0         0
  versicolor      0         48         1
  virginica       0          2        49
  monsterosa      1          0         0
attr(,"error")
[1] 0.02013423
attr(,"mismatch")
[1] 0.006666667

如果我们重构另一个变量以包含两个变量中存在的所有级别,那么不匹配就会消失:

iris$Species=factor(iris$Species,levels= c("setosa", "versicolor",
      "virginica","monsterosa"))
confusion(iris$Predict, iris$Species)
            true
predicted    setosa versicolor virginica monsterosa
  setosa         49          0         0          0
  versicolor      0         48         1          0
  virginica       0          2        49          0
  monsterosa      1          0         0          0
attr(,"error")
[1] 0.02666667

我会比较as.character(unique(Habitat$Field))as.character(unique(Habitat$Map))追踪它。as.character 不是必需的,但它易于阅读。

现在您已经添加了数据,我发现问题似乎是您在某些变量的末尾有尾随空格,而在其他变量的单词之间有双空格。

# see problem
as.character(levels(Habitat$Field))
as.character(levels(Habitat$Map))

# fix problem

# unfactor them for now so we can replace spaces
Habitat$Field<-as.character(Habitat$Field)
Habitat$Map<-as.character(Habitat$Map)

# replace unwanted spaces
Habitat$Field <- gsub("[[:space:]]*$","",Habitat$Field) #gets ending spaces
Habitat$Map <- gsub("[[:space:]]*$","",Habitat$Map) #gets ending spaces
Habitat$Map <- gsub("[[:space:]]{2,}"," ",Habitat$Map) # gets double spaces
Habitat$Field <- gsub("[[:space:]]{2,}"," ",Habitat$Field) # gets double spaces

# factor them again
Habitat$Field <-factor(Habitat$Field)
Habitat$Map<-factor(Habitat$Map)
于 2012-11-12T02:01:44.493 回答