在概念化如何在R中实现线性插值时遇到困难

在概念化如何在R中实现线性插值时遇到困难,r,interpolation,linear-interpolation,R,Interpolation,Linear Interpolation,我对编码相当陌生,甚至在概念化如何在R中实现这个问题上都有困难。 对不起,如果我遗漏了一些非常明显的东西 我试图找出特定气象站每分钟的压力修正系数(y)。 这是公式: x是该位置的高程与某个常数的比值 y是压力修正系数 m是海平面上的光学气团 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

我对编码相当陌生,甚至在概念化如何在R中实现这个问题上都有困难。 对不起,如果我遗漏了一些非常明显的东西

我试图找出特定气象站每分钟的压力修正系数(y)。 这是公式:

x是该位置的高程与某个常数的比值

y是压力修正系数

m是海平面上的光学气团

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要执行插值,可以执行以下操作:

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()
# # 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
库(tidyverse)

df不是最优雅的解决方案,但它使用了
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)
}
这就产生了以下结果:

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()
# # 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

您能否提供DF
DF
,至少是其中的一部分?您可以尝试
dput(head(DF))
。这样我们就可以马上处理一些数据了。谢谢!我已经做到了,这里包含了很多不相关的变量。如果可以,请告诉我。请注意,我很懒,我刚刚选择了相关的VAR:)谢谢您回复我的问候并改进您的问题。太好了。啊,我应该用approxfun。非常感谢您的时间和帮助!:)
# # 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
# df$y
# [1] 1.019438 1.019446 1.019446 1.019429 1.019600 1.019434