无法概念化如何在 R 中实现线性插值
Having trouble conceptualising how to implement a linear interpolation in R
我对编码还很陌生,甚至无法概念化我将如何在 R 中实现这个问题。
对不起,如果我遗漏了一些非常明显的东西。
我正在尝试查找特定气象站每分钟的压力修正系数 (y)。
这是公式:
x 是该位置的高程与某个常数的比值
y为压力修正系数
米是海平面的光学气团
m 取决于一天中的时间,我的时间序列在序列的每一分钟都有一列 m 的值。
when x = 1, y = 1.
when x = 0.75, y= 1.25 -.012*m + .00037*m^2
when x= 0.5, y = 1.68 -.03*m + .0009*m^2
在 x、y 的值之间进行线性插值。
我感兴趣的 x 的值是 0.9804
这是我在实现方面所得到的(不远):
x <- c(0.5 , .75 , 1)
pc1 = 1.248274 - 0.011997*DF$AirMass0 + 0.000370*DF$AirMass0^2
pc2 = 1.68219 - 0.03059*DF$AirMass0 + 0.000890*DF$AirMass0^2
pc <- c(0 , pc1[1], pc2[1] , 1)
approx(x, pc , n = 1000)
我知道这只是在我的时间序列中调用我的第一个气团值。此外,即使 n=1000,我也无法获得 x=9804 的精确值。
我意识到任何人都无法阅读所有这些内容,但我真的很感激任何帮助。
提前致谢:)
编辑:这是我的 df
的头部
> dput(head(DF2))
structure(list(DF.Date = structure(c(1357296180, 1358021760,
1357991280, 1357629540, 1357287540, 1358158260), class = c("POSIXct",
"POSIXt"), tzone = "UTC"), DF.Irradiance = c(1055.64, 0, 975.22,
0.25, 953.33, 1017.62), DF.AirMass0 = c(0.0279842300461168, 0.0195227712650674,
0.0194685363977006, 0.0384509898910604, -0.142855127416022, 0.0322758934562728
)), row.names = c(NA, 6L), class = "data.frame")
> StationHeightCorrection <- exp(-167/8435.52)
> StationHeightCorrection
[1] 0.9803974
要进行插值,您可以执行以下操作:
library(tidyverse)
df <- structure(list(DF.Date = structure(c(1357296180, 1358021760,
1357991280, 1357629540, 1357287540, 1358158260), class = c("POSIXct",
"POSIXt"), tzone = "UTC"), DF.Irradiance = c(1055.64, 0, 975.22,
0.25, 953.33, 1017.62), DF.AirMass0 = c(0.0279842300461168, 0.0195227712650674,
0.0194685363977006, 0.0384509898910604, -0.142855127416022, 0.0322758934562728
)), row.names = c(NA, 6L), class = "data.frame")
df_new <- approx(x = df$DF.AirMass0, y = df$DF.Irradiance,
xout = seq(min(df$DF.AirMass0), max(df$DF.AirMass0), 0.0001)) %>%
bind_cols()
这会将您的 x 插值 0.0001。这样做之后,检索您要查找的值应该很简单。
不是最优雅的解决方案,但这使用了 dplyr
和 magrittr
。首先,我定义你的数据框。
# Data frame called df
# Date Irradiance AirMass0
# 1 2013-01-04 10:43:00 1055.64 0.02798423
# 2 2013-01-12 20:16:00 0.00 0.01952277
# 3 2013-01-12 11:48:00 975.22 0.01946854
# 4 2013-01-08 07:19:00 0.25 0.03845099
# 5 2013-01-04 08:19:00 953.33 -0.14285513
# 6 2013-01-14 10:11:00 1017.62 0.03227589
接下来,我加载相关的库。
# Load libraries
library(dplyr)
library(magrittr)
在这里,我创建了一个函数,它获取一个空气质量并给定 x
值(即 0.9804),创建一个参考数据框(即 x
等于 0.5、0.75 和1 和相应的 y
值),然后创建一个函数,该函数将通过线性插值基于 x
估计 y
。
# Calculate pressure correction based on air mass and x
pres_cor <- function(m, x){
# Create reference data frame
ref_df <- data.frame(x_ref = c(0.5 , 0.75 , 1),
y_ref = c(1.68219 - 0.03059 * m + 0.000890 * m^2, 1.248274 - 0.011997 * m + 0.000370 * m^2, 1))
# Create function for interpolation
int_fun <- with(ref_df, approxfun(x_ref, y_ref))
# Return value at given x value
int_fun(x)
}
最后,我使用管道运算符 (%>%
)、rowwise
和 dplyr
中的 mutate
将其应用于数据框的每一行,以及来自 magrittr
.
的复合分配管道 (%<>%
)
# Use function for each row
df %<>%
rowwise %>%
mutate(y = pres_cor(AirMass0, 0.9804))
这给出了以下内容:
# # A tibble: 6 x 4
# Date Irradiance AirMass0 y
# <dttm> <dbl> <dbl> <dbl>
# 1 2013-01-04 10:43:00 1056. 0.0280 1.02
# 2 2013-01-12 20:16:00 0 0.0195 1.02
# 3 2013-01-12 11:48:00 975. 0.0195 1.02
# 4 2013-01-08 07:19:00 0.25 0.0385 1.02
# 5 2013-01-04 08:19:00 953. -0.143 1.02
# 6 2013-01-14 10:11:00 1018. 0.0323 1.02
请注意,由于四舍五入,y
值看起来相同,但仔细检查后却并非如此。
# df$y
# [1] 1.019438 1.019446 1.019446 1.019429 1.019600 1.019434
我对编码还很陌生,甚至无法概念化我将如何在 R 中实现这个问题。 对不起,如果我遗漏了一些非常明显的东西。
我正在尝试查找特定气象站每分钟的压力修正系数 (y)。 这是公式:
x 是该位置的高程与某个常数的比值
y为压力修正系数
米是海平面的光学气团
m 取决于一天中的时间,我的时间序列在序列的每一分钟都有一列 m 的值。
when x = 1, y = 1.
when x = 0.75, y= 1.25 -.012*m + .00037*m^2
when x= 0.5, y = 1.68 -.03*m + .0009*m^2
在 x、y 的值之间进行线性插值。
我感兴趣的 x 的值是 0.9804
这是我在实现方面所得到的(不远):
x <- c(0.5 , .75 , 1)
pc1 = 1.248274 - 0.011997*DF$AirMass0 + 0.000370*DF$AirMass0^2
pc2 = 1.68219 - 0.03059*DF$AirMass0 + 0.000890*DF$AirMass0^2
pc <- c(0 , pc1[1], pc2[1] , 1)
approx(x, pc , n = 1000)
我知道这只是在我的时间序列中调用我的第一个气团值。此外,即使 n=1000,我也无法获得 x=9804 的精确值。
我意识到任何人都无法阅读所有这些内容,但我真的很感激任何帮助。
提前致谢:)
编辑:这是我的 df
的头部> dput(head(DF2))
structure(list(DF.Date = structure(c(1357296180, 1358021760,
1357991280, 1357629540, 1357287540, 1358158260), class = c("POSIXct",
"POSIXt"), tzone = "UTC"), DF.Irradiance = c(1055.64, 0, 975.22,
0.25, 953.33, 1017.62), DF.AirMass0 = c(0.0279842300461168, 0.0195227712650674,
0.0194685363977006, 0.0384509898910604, -0.142855127416022, 0.0322758934562728
)), row.names = c(NA, 6L), class = "data.frame")
> StationHeightCorrection <- exp(-167/8435.52)
> StationHeightCorrection
[1] 0.9803974
要进行插值,您可以执行以下操作:
library(tidyverse)
df <- structure(list(DF.Date = structure(c(1357296180, 1358021760,
1357991280, 1357629540, 1357287540, 1358158260), class = c("POSIXct",
"POSIXt"), tzone = "UTC"), DF.Irradiance = c(1055.64, 0, 975.22,
0.25, 953.33, 1017.62), DF.AirMass0 = c(0.0279842300461168, 0.0195227712650674,
0.0194685363977006, 0.0384509898910604, -0.142855127416022, 0.0322758934562728
)), row.names = c(NA, 6L), class = "data.frame")
df_new <- approx(x = df$DF.AirMass0, y = df$DF.Irradiance,
xout = seq(min(df$DF.AirMass0), max(df$DF.AirMass0), 0.0001)) %>%
bind_cols()
这会将您的 x 插值 0.0001。这样做之后,检索您要查找的值应该很简单。
不是最优雅的解决方案,但这使用了 dplyr
和 magrittr
。首先,我定义你的数据框。
# Data frame called df
# Date Irradiance AirMass0
# 1 2013-01-04 10:43:00 1055.64 0.02798423
# 2 2013-01-12 20:16:00 0.00 0.01952277
# 3 2013-01-12 11:48:00 975.22 0.01946854
# 4 2013-01-08 07:19:00 0.25 0.03845099
# 5 2013-01-04 08:19:00 953.33 -0.14285513
# 6 2013-01-14 10:11:00 1017.62 0.03227589
接下来,我加载相关的库。
# Load libraries
library(dplyr)
library(magrittr)
在这里,我创建了一个函数,它获取一个空气质量并给定 x
值(即 0.9804),创建一个参考数据框(即 x
等于 0.5、0.75 和1 和相应的 y
值),然后创建一个函数,该函数将通过线性插值基于 x
估计 y
。
# Calculate pressure correction based on air mass and x
pres_cor <- function(m, x){
# Create reference data frame
ref_df <- data.frame(x_ref = c(0.5 , 0.75 , 1),
y_ref = c(1.68219 - 0.03059 * m + 0.000890 * m^2, 1.248274 - 0.011997 * m + 0.000370 * m^2, 1))
# Create function for interpolation
int_fun <- with(ref_df, approxfun(x_ref, y_ref))
# Return value at given x value
int_fun(x)
}
最后,我使用管道运算符 (%>%
)、rowwise
和 dplyr
中的 mutate
将其应用于数据框的每一行,以及来自 magrittr
.
%<>%
)
# Use function for each row
df %<>%
rowwise %>%
mutate(y = pres_cor(AirMass0, 0.9804))
这给出了以下内容:
# # A tibble: 6 x 4
# Date Irradiance AirMass0 y
# <dttm> <dbl> <dbl> <dbl>
# 1 2013-01-04 10:43:00 1056. 0.0280 1.02
# 2 2013-01-12 20:16:00 0 0.0195 1.02
# 3 2013-01-12 11:48:00 975. 0.0195 1.02
# 4 2013-01-08 07:19:00 0.25 0.0385 1.02
# 5 2013-01-04 08:19:00 953. -0.143 1.02
# 6 2013-01-14 10:11:00 1018. 0.0323 1.02
请注意,由于四舍五入,y
值看起来相同,但仔细检查后却并非如此。
# df$y
# [1] 1.019438 1.019446 1.019446 1.019429 1.019600 1.019434