在构思如何在R中实现线性插值时遇到麻烦

佐尔

我对编码还很陌生,甚至在概念化方面也遇到了麻烦,如果我错过了完全显而易见的内容,对不起,我将如何在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 <- 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
林格巴克

不是最优雅的解决方案,但这使用dplyrmagrittr首先,我定义您的数据框。

# 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值),然后创建一个函数,该函数将y基于x通过线性插值。

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

最后,我使用管道运算符(%>%rowwisemutatefromdplyr以及复合赋值管道(%<>%将其应用于数据框的每一行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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章