在 terra 包中计算 kmeans 和简单结构索引的问题

问题描述 投票:0回答:1

在 terra 中工作以进行无监督分类

我使用 terra pacakge 已经有一段时间了,现在我想看看我是否可以在栅格中做一些我用来做的任务,在这些任务中我必须在制作函数之前将栅格转换为数据框,这是通常的我用来做的任务是空间栅格的最佳类,我用来做的是这样的:

首先我加载包并将堆栈转换为数据框

library(terra)
library(geodata)
library(vegan)
library(dplyr)

# download climatic variables from terra
Clim <- geodata::worldclim_country(country = "denmark", var = "bio", path = getwd())


# Transform to data frame, keeping the cells to translate back to raster
ClimDF <- terra::as.data.frame(Clim, cells = T)

然后我使用了 vegan 包中的 cascadeKM 函数,我声明我想测试 2 到 5 组的聚类。这将使这些聚类并计算一些索引,calinski 或简单结构索引,然后看看哪个是最佳聚类

## Use cascade km to find several  kmeans plus index
Clust <- vegan::cascadeKM(data = ClimDF[,-1], inf.gr = 2, sup.gr = 5)

## Get the maximum Calinski to see what is the optimum clustering
OptimumClust <- Clust$results |> 
  t() |> 
  as.data.frame() |> 
  dplyr::filter(calinski == max(calinski)) |> 
  rownames()

然后我将值返回给模板

Template <- Clim[[1]]

values(Template) <- NA

Template[ClimDF$cell] <- Clust$partition[,OptimumClust]

plot(Template, colNA = "black")

现在我想绕过整个转换到 data.frame,所以我首先尝试只做 kmeans,然后看看我是否真的可以计算 calinski 或 SSI,但即使在那个时候我也卡住了,我是按照这个tutorial,但是这是行不通的

第一次尝试

我试图复制上述教程:

set.seed(99)
# We want to create 10 clusters, allow 500 iterations, start with 5 random sets using "Lloyd" method
kmncluster <- kmeans(na.omit(Clim), centers = 5, iter.max = 500, nstart = 5)

但是,我得到这个错误

Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)

我不确定为什么一开始会出现这个错误,na.omit 不会去掉 NA 值吗?我检查了没有 Inf 或 -Inf。我梦想的场景是用 spatVect 完成在 cascadeKM 中完成的所有工作,而不必去 data.frame 来回,但如果我真的可以做一个 kmeans 我什至无法开始

r cluster-analysis terra
1个回答
0
投票

我假设教程中的示例失败,因为您的数据中有 NA。这是一个扩展版本(具有更简单的输入数据),它说明了 NA。 示例数据

library(terra)
s <- rast(system.file("ex/logo.tif", package="terra"))   
s[1,] <- NA

k-均值

v <- na.omit(values(s))
set.seed(99)
kmn <- kmeans(v, centers=5, iter.max = 500, nstart = 5, algorithm="Lloyd")

kr <- rast(s, nlyr=1)
i <- attr(v, "na.action")
j <- (1:ncell(s))[-i]
kr[j] <- kmn$cluster

plot(kr)

© www.soinside.com 2019 - 2024. All rights reserved.