GRACE重力卫星缺失值插补及深度学习重构数据(二),缺失值插补方法对比及代码实现。该方法也适用于任何缺失数据的栅格或NC文件

一、引言

GRACE(Gravity Recovery and Climate Experiment)卫星是美国国家航空航天局(NASA)和德国航空航天中心(DLR)合作运营的一组卫星,在2002年至2017年期间对地球引力场进行了高精度测量。由于月球的引力也会对地球引力场产生影响,因此GRACE卫星还被用来探测月球引力场的细微变化,以研究月球内部的构造和演化。

GRACE月时变迁模型用于描述月球引力场的时变特征,是研究月球结构和演化的重要工具。然而,由于各种原因(如仪器故障、数据传输中断等),GRACE卫星获取的数据中可能会存在缺失值。这些缺失值会影响月时变迁模型的精度和可靠性,因此有必要采取合适的方法进行填补。

本文将介绍一种常用的缺失值填补方法——三次多项式插值法,并探讨其在GRACE月时变迁模型中的应用。这个方法在MODIS卫星或者任何缺失数据的栅格文件,nc文件都适用。

二、三次多项式插值法简介

插值法是一种在给定数据点的前提下,通过构造描述这些数据点的函数来近似未知函数的方法。当数据点存在缺失值时,插值法可以通过其他已知数据点来填补缺失值,从而使得数据的连续性和完整性得到保证。

三次多项式插值法是插值法中较为常用的一种方法。其基本思想是,对于给定的数据点,通过构造一个三次多项式函数来近似未知函数,并满足函数在每个数据点处的函数值等于相应数据点的函数值。通过求解三次多项式的系数,可以得到插值函数,并用于填补数据缺失值。

三次多项式插值法的优点在于可以较好地拟合数据的非线性特征,同时又不会过度拟合数据。此外,三次多项式插值法还具有较高的计算效率和较低的误差。

三、数据集

  1. 数据预处理
library(ncdf4)
ncdata <- nc_open("data.nc")
lon <- ncvar_get(ncdata,'lon') # 经度
lat <- ncvar_get(ncdata,'lat') # 纬度
time <- ncvar_get(ncdata,'time') # 时间
lwe_thickness <- ncvar_get(ncdata,'lwe_thickness') # 覆盖厚度

# 这份测绘数据起始时间是2002.01.01,time的值表示过去的天数
time <- as.Date("2002-01-01") + time

library(data.table)

# 对数据进行重组和转置,以扁平化数据结构
lwe_thickness_flat <- as.data.table(lwe_thickness)

# lon
lwe_thickness_flat$V1 <- lon[lwe_thickness_flat$V1]
# lat
lwe_thickness_flat$V2 <- lat[lwe_thickness_flat$V2]
# time
lwe_thickness_flat$V3 <- time[lwe_thickness_flat$V3]

# 将数据框lwe_thickness_flat转换为数据表对象
lwe_thickness_flat<-as.data.table(lwe_thickness_flat)
# 设置列名
setnames(lwe_thickness_flat, c("V1","V2","V3","value"), c("lon","lat","time","lwe_thickness"))

  1. 获取缺失子集作为演示
library(dplyr)

# 对数据进行日期筛选
sampled_data <- lwe_thickness_flat %>% 
                     filter(time < as.Date("2003-12-16"))
  1. 结果展示
              lon     lat       time lwe_thickness
       1:   0.125 -89.875 2002-04-18     -2.468668
       2:   0.125 -89.875 2002-05-10     -1.569404
       3:   0.125 -89.875 2002-08-16     -3.044039
       4:   0.125 -89.875 2002-09-16     -3.201635
       5:   0.125 -89.875 2002-10-16     -1.785586
      ---                                         
17625596: 359.875  89.875 2003-07-16      3.973456
17625597: 359.875  89.875 2003-08-16      3.146194
17625598: 359.875  89.875 2003-09-16      3.110446
17625599: 359.875  89.875 2003-10-16      4.867654
17625600: 359.875  89.875 2003-11-16      2.196712

四、填补缺失值

  1. 找出缺失的年月
time_sub <- unique(sampled_data$time)
# 提取年月信息
year_month <- format(as.Date(time_sub), "%Y-%m")

# 构造包含所有年月的数据框
start_date <- min(year_month)
end_date <- max(year_month)
all_dates <- seq(as.Date(paste0(start_date, "-01")), as.Date(paste0(end_date, "-01")), by = "month")
all_year_month <- format(all_dates, "%Y-%m")
df_all_dates <- data.frame(year_month = all_year_month, date = all_dates, stringsAsFactors = FALSE)

# 找出缺失的日期
missing_dates <- df_all_dates[!df_all_dates$year_month %in% year_month, ]

# 打印输出缺失的日期
print(missing_dates$year_month)
  1. 填充经度、纬度和时间
# 选取一个栅格的数据
grid_data <- lwe_thickness_flat %>% 
                     filter(time == as.Date("2002-04-18"))
grid_data$lwe_thickness <- NA


# 插入缺失年月的数据
for(i in 1:nrow(missing_dates)){
    grid_data$time <- missing_dates$date[i]
    sampled_data <- rbind(sampled_data, grid_data)
}

  1. 按照时间排序
sampled_data <- sampled_data[order(sampled_data$time)]
# 检查排序结果
time_order <- unique(sampled_data$time)
time_order

结果展示:

[1] "2002-04-18" "2002-05-10" "2002-06-01" "2002-07-01" "2002-08-16"
 [6] "2002-09-16" "2002-10-16" "2002-11-16" "2002-12-16" "2003-01-16"
[11] "2003-02-15" "2003-03-16" "2003-04-16" "2003-05-11" "2003-06-01"
[16] "2003-07-16" "2003-08-16" "2003-09-16" "2003-10-16" "2003-11-16"

缺失的三个月份补充进去了

  1. 三次多项式插值
# 导入插值包
install.packages("rugarch")
install.packages("zoo")
library(rugarch)
library(zoo)

library(imputeTS)

# 使用三次多项式插值填补缺失值
sampled_data$lwe_thickness_filled <- na.spline(sampled_data$lwe_thickness)

# 过滤出缺失的数据,查看数据是否有插入
grid_data_filled <- sampled_data %>% 
                     filter(time == as.Date("2002-06-01"))

# 写入文件并忽略行名
fwrite(sampled_data, file = "D:/log/grace.csv", row.names = FALSE)

结果展示:

             lon     lat       time lwe_thickness lwe_thickness_filled
      1:   0.125 -89.875 2002-06-01            NA        -1.734405e+00
      2:   0.125 -89.625 2002-06-01            NA        -2.077785e+00
      3:   0.125 -89.375 2002-06-01            NA        -2.421165e+00
      4:   0.125 -89.125 2002-06-01            NA        -2.764544e+00
      5:   0.125 -88.875 2002-06-01            NA        -3.107923e+00
     ---                                                              
1036796: 359.875  88.875 2002-06-01            NA        -1.765162e+05
1036797: 359.875  89.125 2002-06-01            NA        -1.765162e+05
1036798: 359.875  89.375 2002-06-01            NA        -1.765162e+05
1036799: 359.875  89.625 2002-06-01            NA        -1.765162e+05
1036800: 359.875  89.875 2002-06-01            NA        -1.765162e+05

如果不想追加一列lwe_thickness_filled,可以直接赋值给lwe_thickness。我追加一列的目的是方便对比。

参考文献:

Using Satellite‑Based Terrestrial Water Storage Data: A Review

GraphicsMem->DrawString(L"密 码", -1, font, rc2, NULL, &solidBrush); // 创建背GRACE数据的空缺数据有多种方法,以下是一些常用的方法: 1. 线性值景矩形区域颜色刷子对象,并根据是否登录按钮被按下进行颜色设置 SolidBrush Brush(Color(255, 240, 240, 240)); if (m_bLoginPressed) Brush.SetColor(Color(255, :线性值是最简单的方法,它假设在两个已知数据点之间的未知数据点之间存在一个直线关系。根据已知数据点的数值和位置,可以使用线性值210, 210, 210)); // 填充背景矩形区域 pGraphicsMem->FillRectangle(&Brush, 240, 230, 120, 30); Gdiplus::Font* font1 = new Gdiplus::Font(L来估计未知数据点的值。 2. 多项式值:多项式方法使用一个多项式"宋体", 11); RectF rc3(280, 237, 360, 260); // 绘制登录按钮函数来逼近已知数据点,并利用该多项式函数来估计未知数据点的值。常见的文本 pGraphicsMem->DrawString(L"登 录", -1, font, rc3, NULL, &solidBrush); 多项式方法包括拉格朗日值和牛顿值。 3. 样条值:样条 // 根据提示信息的类型绘制相应的提示文本 if (m_nTips != 0) { 方法利用分段多项式函数来逼近已知数据点,并利用这些分段多项式函数 RectF rc4(230, 200, 360, 220); SolidBrush BrushTips(Color(255, 255,来估计未知数据点的值。其中,最常用的样条方法是三次样条值。 0, 0)); if (m_nTips == 1) { pGraphicsMem->DrawString(L"请正确4. 克里金值:克里金值是一种基于空间自相关性的方法,它输入账号密码", -1, font1, rc4, NULL, &BrushTips); } else if (m_nTips == 2) { pGraphicsMem->DrawString(L"密码错误", -1, font1, rc4, NULL假设未知数据点的值与其周围已知数据点的距离和变化趋势有关。通过分, &BrushTips); } else if (m_nTips == 3) { pGraphicsMem->DrawString(L"析已知数据点之间的空间相关性,可以使用克里金值来估计未知数据点的值账号不存在", -1, font1, rc4, NULL, &BrushTips); } } // 在设备上。 选择合适的方法应该考虑数据的特点以及值结果的准确性和平滑性下文中绘制位图 graphics.DrawImage(pBitmap, 0, 0); return 0; } ``` 要求。在进行值之前,建议先对数据进行预处理,例如去除异常值和平滑处理,这段代码的作用是绘制一个登录窗口,包括背景图片、标题、用户名、密码、登录按钮和以提高值结果的可靠性。同时,也要注意值过程中可能引入的误差和不提示信息等。具体绘制内容和样式可以根据需要进行修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值