spatstat::density.psp() 中权重的意外结果

Unexpected result with weights in spatstat::density.psp()

我正在尝试使用核密度平滑来绘制可能的害虫从车辆交通中逃逸的强度。每条路线都被分解成直线,每条线都有一个整数属性,表示该段行驶的次数。但是,当我在核密度平滑中使用这个属性作为权重时,权重似乎没有被使用。

我在下面用两条相邻的直线创建了一个简化的代表。任何人都可以向我解释如何让 density.psp() 说明一个片段的属性是另一个片段的 2 倍吗?

非常感谢您的帮助,

乔希

    # Load packages 
    library(spatstat)
    
    # Create the data frame. Note that coordinates are projected to the
    # North America Lambert Conformal Conic system. https://epsg.io/102009
    my_lines <- data.frame(
      fx = c(1252365.22479882, 1233600.0015391),
      fy = c(510853.438463705, 626675.859171899),
      tx = c(1233600.0015391, 1218256.03484937),
      ty = c(626675.859171899, 721347.256108354),
      attrib = c(100, 50)
    ) 
    
    # Creat the observation window
    my_owin <- owin(
      xrange = c(1200000, 1270000),
      yrange = c(500000,  730000)
    ) 
    
    # Create the psp object with 'attrib' as the mark. 
    my_psp <- psp(
      x0 = my_lines$fx, y0 = my_lines$fy,
      x1 = my_lines$tx, y1 = my_lines$ty,
      window = my_owin, marks = my_lines$attrib
    )
    
    # Create the KDS image with 'attrib' as the weights
    kdi_image_weighted <-
      density.psp(
        my_psp,
        kernel = "gaussian",
        sigma = 4000,
        weights = my_psp$attrib,
        edge = FALSE
      )
    
    # Create the KDS image without weights
    kdi_image_unweighted <-
      density.psp(
        my_psp,
        kernel = "gaussian",
        sigma = 4000,
        edge = FALSE
      )
    
    # Plot the weighted and unweighted KDS images. Note that they are the same 
    # despite one being weighted. 
    plot(kdi_image_weighted) 
    plot(kdi_image_unweighted)

简答:

使用marks()spatstat包中的对象中提取标记值。示例:

 Z <- density(my_psp, weights=marks(my_psp))

长答案:

此问题与函数density.psp无关。

首先是对对象名称的误解。在您的示例中,对象 my_psp 被创建为 psp(.... marks=my_lines$attrib)。然后后续代码期望 my_psp 包含一个元素 my_psp$attrib。这不是评估在 R 中的工作方式。

当您键入命令 psp(...., marks=my_lines$attrib) 时,将计算表达式 my_lines$attrib(通过从对象 my_lines 中提取名为 attrib 的元素)。在评估了这些数据之后,系统忘记了它从哪里得到数据;忘记了名字 attrib。结果数据(存储在 my_lines$attrib 中)将作为参数 marks.

传递给函数 psp

其次,您正在使用 $ 运算符从对象中提取数据(在本例中是 spatstat 包中 class "psp" 的对象)。这对于列表这样的简单对象是可以的,但是对于由包创建的对象来说这是不安全的,因为包更新时内部结构可能会改变。

您的示例代码期望对象 my_psp 包含具有特定名称的元素,但没有理由如此。函数 psp() 创建了一个 class "psp" 的对象,它有一些奇怪的内部结构,在 help(psp.object).

中有描述

要从spatstat包中的对象中提取标记值,目前可以使用$marks,但这可能会改变,强烈建议使用函数marks().