【问题标题】:Error related to randomisation test within lapply() function in R与 R 中 lapply() 函数中的随机化测试相关的错误
【发布时间】:2019-03-16 18:11:58
【问题描述】:

我有 30 个数据集,它们组合在一个数据列表中。我想通过L function 以及随机化测试来分析空间点模式。代码如下。 第一个代码适用于单个数据集(data1),但是一旦将其应用于具有lapply() 函数的数据集列表,如第二个代码所示,它会给我一个非常长的错误,就像这样,

"Kcross(X, i, j, ...) 中的错误:没有点有标记 i = Acoraceae 信封引擎错误(X = X,fun = fun,simul = simrecipe,nsim = nsim, : 超过最大错误数"

谁能告诉我第二个代码有什么问题?

 grp <- factor(data1$species)               
 window <- ripras(data1$utmX, data1$utmY)      
 pp.grp <- ppp(data1$utmX, data1$utmY, window=window, marks=grp) 
 L.grp  <- alltypes(pp.grp, Lest, correlation = "Ripley")
 LE.grp <- alltypes(pp.grp, Lcross, nsim = 100, envelope = TRUE)  
 plot(L.grp)
 plot(LE.grp)


 L.LE.sp <- lapply(data.list, function(x) { 
   grp <- factor(x$species)               
   window <- ripras(x$utmX, x$utmY)
   pp.grp <- ppp(x$utmX, x$utmY, window = window, marks = grp)  
   L.grp  <- alltypes(pp.grp, Lest, correlation = "Ripley")
   LE.grp <- alltypes(pp.grp, Lcross, envelope = TRUE)  
   result <- list(L.grp=L.grp, LE.grp=LE.grp)
   return(result)
 })
 plot(L.LE.sp$LE.grp[1])

【问题讨论】:

  • 可能是您列表中的一个或多个数据集存在影响您的流程的数据问题。尝试将function 包裹在tryCatch 中。如果您对每个数据帧手动运行第一个代码,它是否可以正常工作?
  • 是的,它适用于每个数据帧。实际上,我成功地将其他许多功能应用于此数据列表。但是当我将最后一个函数(带信封)添加到这个 lappy() 函数时,就会出现这个错误。所以我猜代码的最后一个函数有问题
  • 在第一个代码块中,您使用q1$utmY 表示ripras,但不在lapply 中。
  • 对不起,实际上 q1 是 data1。在我的原始代码中,我命名为 q1。在这里,为了更清楚,我将该名称转换为 data1。
  • 在第一个代码中,您在 alltypes 的第二次调用中使用 arg nsim = 100,但在 lapply 中不使用。

标签: r function lapply spatstat


【解决方案1】:

这个问题是关于R包spatstat

如果您可以添加一个包含演示此问题的数据的最小工作示例,将会有所帮助。

如果不可用,请在您的计算机上生成错误,然后键入 traceback() 并捕获输出并将其发布在此处。这将跟踪错误的位置。

如果没有这些信息,我的最佳猜测如下: 错误消息显示No points have mark i=Acoraceae。这意味着代码期望点模式包含Acoraceae 类型的点,但发现没有。这可能会发生,因为在alltypes(... envelope=TRUE) 中,代码会根据完全的空间随机性生成随机点模式。在模拟模式中,Acoraceae 类型的点数(例如)将根据 Poisson 分布随机分布,其平均值等于观察数据中 Acoraceae 类型的点数。如果实际数据中的 Acoraceae 数量很少,那么模拟模式很可能根本不包含 Acoraceae。这可能是导致错误消息No points have mark i=Acoraceae 的原因。

如果这个解释是正确的,那么你应该能够通过包含参数fix.marks=TRUE 来抑制错误,也就是说,

alltypes(pp.grp, Lcross, envelope=TRUE, fix.marks=TRUE, nsim=99)

我并不是说这一定适合您的应用程序,但如果我的猜测是正确的,这应该会删除错误消息。

在 github 上提供的 spatstat 的最新开发版本中,envelope 的代码已被调整以检测此错误。

【讨论】:

  • @阿德里安。我想确定您所说的“我并不是说这一定适合您的应用程序”是什么意思。我应该通过另一个测试来检查 CSR 吗?您认为哪种方法适合这种情况?谢谢!
  • @阿德里安·巴德利。此错误消息已解决,但出现另一个错误“有 50 个或更多警告(使用 warnings() 查看前 50 个)”
猜你喜欢
  • 2013-06-21
  • 2018-07-10
  • 2019-09-12
  • 1970-01-01
  • 2012-03-11
  • 2023-01-07
  • 2013-05-16
  • 1970-01-01
  • 2016-07-06
相关资源
最近更新 更多