【问题标题】:Getting NA with Akima Interpolation in R在 R 中使用 Akima 插值获得 NA
【发布时间】:2018-06-26 15:05:06
【问题描述】:

我正在尝试使用 akima 包 interp 函数将一些网格值插入到路段上的一个点。由于那些时候数据丢失,数据点并不总是在那里。例如,请参见下图。

显示的 lat/lng 点是具有来自我的数据集的 dBz 值的点(如果没有值,我们的数据库不会记录条目)。我的目标是使用此网格将 dBz 值插入到特定的纬度/经度点(即纬度 = 39.95045 和经度 = -86.3574)

我的数据如下...

mrms
   tstamp: POSIXct: format: "2018-06-09 16:56:00" ...
   dBz: int 27 26 50 ...
   latitude: num 39.9 39.9 39.9 ...
   longitude: num -86.4 -86.4 -86.4

如果我对特定时间的数据进行子集化(因为每个时间戳有多个条目。我的数据如下所示。

        tstamp     dBz  latitude    longitude

1   6/9/2018 16:58  50  39.92501    -86.37501
2   6/9/2018 16:58  52  39.93498    -86.36501
3   6/9/2018 16:58  29  39.93498    -86.355
4   6/9/2018 16:58  38  39.91499    -86.37501
5   6/9/2018 16:58  44  39.92501    -86.36501
6   6/9/2018 16:58  23  39.92501    -86.355
7   6/9/2018 16:58  52  39.93498    -86.37501
8   6/9/2018 16:58  50  39.94498    -86.36501
9   6/9/2018 16:58  23  39.90501    -86.36501
10  6/9/2018 16:58  51  39.94498    -86.37501
11  6/9/2018 16:58  18  39.90501    -86.37501
12  6/9/2018 16:58  37  39.91499    -86.36501

在对数据进行子集化后,我运行以下命令...

interpolated <- interp(x = mrms_sub$longitude, y = mrms_sub$latitude, z = mrms_sub$dBz, xo = road$longitude, yo = road$latitude, linear = TRUE)

产生 x = num -86.4、y = num 40 和 z = num NA

我不知道为什么 interp 不断产生 NA 值。当我通过 csv 文件读取所有数据时,我以前使用过这种方法。我已经检查了我的 csv 方法的数据类型与将数据从 SQL Server 拉入数据帧,它们是相同的。非常感谢任何想法或建议!

更新

require(tidyverse)
require(RODBC)
require(akima)

##### Road Details #####
cnx_wx <- odbcConnect("dbName", uid = "", pwd = "")
cnx_rd <- odbcConnect("dbName", uid = "", pwd = "")

queryString <- 
  "SELECT
          XDSegID,
      RoadNumber,
      RoadName,
      Bearing,
      geog.EnvelopeCenter().STAsText() as roadCenter
    FROM [itsdb1].[inrix_xd].[dbo].[__xd] as inrix_xd
    WHERE XDSegID = 1363484955 AND version = '2018-04-25'"

road <- sqlQuery(cnx_rd, queryString)

#Massage road center lat long points
road$roadCenter <- gsub("POINT|\\(|\\)", "", road$roadCenter)
road = separate(road, roadCenter, into = c("junk", "longitude", "latitude"), sep = " ")
road$longitude <- as.numeric(road$longitude)
road$latitude <- as.numeric(road$latitude)


##### Speed Data #####
queryString <- 
  "SELECT
      CAST(tstamp as smalldatetime) as tstamp,
      xdid,
      speed,
      score,
      cvalue
    FROM itsdb1.inrix_xd.dbo.xdspeeds
    WHERE tstamp >= '2018-06-09 15:00:00' AND tstamp <= '2018-06-09 18:00:00'
    AND xdid = 1363484955
    ORDER BY tstamp"

speed <- sqlQuery(cnx_rd, queryString)
#attr(speed$tstamp, "tzone") <- "GMT"
odbcClose(cnx_rd)


##### MRMS Data #####
queryString <- 
  "SELECT
      CAST(tstamp as smalldatetime) as tstamp,
      dBz,
      latitude,
      longitude
    FROM weather_mrms.dbo.v_seamless_hsr
    WHERE tstamp >= '2018-06-09 15:00:00' AND tstamp <= '2018-06-09 18:00:00'
    AND latitude BETWEEN 39.90 AND 39.95 AND longitude BETWEEN -86.38 AND -86.29
    ORDER BY tstamp"

mrms <- sqlQuery(cnx_wx, queryString)
odbcClose(cnx_wx)


##### Combined Data #####
numOfwxLevels <- nlevels(as.factor(mrms$tstamp))

i <- 1
obsTime <- mrms$tstamp[2]

output <- data.frame(0,0)
colnames(output) <- c("tstamp", "Interpolated dBz")

while (i <= numOfwxLevels) {
  mrms_sub <- filter(mrms, mrms$tstamp == obsTime)

  interpolated <- akima::interp(x = mrms_sub$longitude, y = mrms_sub$latitude, z = mrms_sub$dBz,
                         xo = road$longitude, yo = road$latitude, linear = TRUE)

  val <- c(obsTime, interpolated$z)
  newTable <- rbind(output, val)
  obsTime <- obsTime + 120
  i <- i + 1

}

【问题讨论】:

  • 您的预期输出是什么? road 数据是什么?
  • 我期待某种 dBz 值在 40-50 左右。我很抱歉一开始没有说清楚。还有什么我遗漏的吗?编辑->道路数据只是一个数据框,其中包含要插入的经纬度点,它还有一些其他信息,但这些对插值都不重要。
  • 您用来创建输出网格的点是什么?我只是想复制它。
  • 我想我明白你在问什么,我用于输出网格的点是道路 $ 经度,道路 $ 纬度。我只对插值感兴趣的一点是我的“网格”。也许我误解了如何使用 interp 功能,如果是这样,我很抱歉。我仍在努力真正掌握 R。
  • 你感兴趣的经纬度值是多少?

标签: r interpolation


【解决方案1】:

阅读help file for it 它带来了两件事:1) 它建议反对colinear 点,2) 它不能使用linear interpolation 进行推断,这就是为什么你在你的之外得到NA数据。

如果您使用其他插值,它会起作用,但我怀疑这就是您想要的。您可能需要考虑另一种方法。

df1terp2 <- interp(x = mrms_sub$longitude, y = mrms_sub$latitude, z = mrms_sub$dBz, xo = 39.95045, yo = -86.3574, linear = FALSE, extrap = TRUE)

$`x`
[1] 39.95045
$y
[1] -86.3574
$z
    [,1]
[1,] -78789.37

【讨论】:

  • 除了在代码块中写的内容之外,您是否做过任何事情?我问的原因是因为如果我复制并运行你的代码,我的 z 值仍然是 NA。
  • 不,但我明白你在说什么。我只是在控制台中运行interp,我也得到NA。但是如果我将它存储到任何东西,它会给出一个奇怪的值。这些two 问题may be some help
  • 更奇怪的是,我以前可以工作的代码(对于线性 = T 和 F)不再工作了。我重新加载了 R studio,它现在可以工作了......我将看看是否只需要重新启动。
  • 这似乎没有成功。我现在正在用我的完整源代码编辑问题。
猜你喜欢
  • 1970-01-01
  • 2019-08-18
  • 2022-12-05
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多