R语言:如何基于地球外辐射(Ra)和相对日照(n/N)计算太阳辐射Rs?

正在编写相关软著,借此机会了解R语言的基本语法和一些处理流程,所以解释稍微繁琐。

Note

使用的R语言版本是 R version 4.3.2 (2023-10-31 ucrt)

使用的RStudio编辑器版本是:
在这里插入图片描述

01 基于随机森林的插值填补缺失值

这是目前处理的数据样式如下:

在这里插入图片描述

1.1 准备工作

library(mice)  # 加载mice包, 这是一个用于处理缺失数据的R包, 可以进行多重插值填补缺失值
setwd("I:\\ObjectRS\\软著_绘姐\\SC1_Rs\\")  # 设置工作目录, 类似环境变量配置
TJ<-read.csv("TJ_var8_1970-2022_2st_ori.csv")  # 添加数据

library():加载包到当前运行文件中,类似Python的import,如果你想要使用某个统计包,你需要先加载至当前文件中才可以在当前代码块中使用该包相关函数和方法。

setwd():设置工作目录,类似于环境变量。即如果传入一个文件名而非文件的绝对路径时,此时解释器会先在工作目录中检索该文件是否存在。

变量 <- read.csv():读取csv文件内数据,并将得到的对象使用<-赋值给某一变量,<-等价于Python中的=。值得注意的是,read.csv并非是指利用.访问read对象中的方法csv方法,而是说.仅仅是作为函数名的一部分,并没有特殊含义,即read.csv就是一个函数的名称。

运行结果

1.2 读取数据和数据预处理

mydata <- TJ[, 9:ncol(TJ)]
md.pattern(mydata)  # 返回数据的缺失值的模式
anyNA(mydata)       #> TRUE
str(mydata)

TJ[, 9:ncol(TJ)]:表示取第9列(包含)到最后一列(包含)的所有行,值得注意的是,R的索引是从1开始计数,而非如Python从0开始,使用[,]进行截取,,前面为行,后面为列。如果需要选择所有行,那么逗号前面无需添加任何内容。ncol函数用于获取TJ变量的总列数,注意9:ncol(TJ)表示第9到最后一列(左右闭区间),而非像Python为第9到倒数第二列(左闭右开)。

运行得到的结果mydata为:

在这里插入图片描述

md.pattern():表示输出该数据框的缺失模式,输出如下:

在这里插入图片描述

也即:

在这里插入图片描述

anyNA():表示只要传入的数据框中但凡存在一个缺失值,那么返回True,否则返回False。

str():输出传入数据框中各个列标签的数值类型和部分内容,注意这里的str不是将其转化为字符串而是输出数据框结构(structure)。运行结果如下:

在这里插入图片描述

1.3 插值和输出

miceMod <- mice(mydata, method="rf")#默认为PMM(预测均值匹配),norm(贝叶斯线性回归)、norm.boot(基于bootstrap的线性回归)、norm.predict(线性回归预测值)、cart、rf
summary(miceMod)
miceOutput <- complete(miceMod)  # 生成完整数据
anyNA(miceOutput)#> FALSE
miceOutput <- cbind(TJ[,1:8],miceOutput)
write.csv(miceOutput, "TJ_var8_1970-2022_2st_rf.csv",row.names = F)

miceMod <- mice(mydata, method="rf"):表示对其中的缺失值进行插值,插值方法选择随机森林。默认为PMM(预测均值匹配),norm(贝叶斯线性回归)、norm.boot(基于bootstrap的线性回归)、norm.predict(线性回归预测值)、cart、rf。迭代过程如下:

在这里插入图片描述

summary(miceMod):用于展示输出插补的一些概要信息,运行结果如下:

在这里插入图片描述

miceOutput <- complete(miceMod):生成完整的数据集,将原先的原始数据集中的NA值替换为插值的结果,得到完整无NA的数据集。

anyNA(miceOutput):查看目前完整的数据集是否还存在NA值,保证没有缺失值的存在。

miceOutput <- cbind(TJ[,1:8],miceOutput):将原始数据集TJ的前几列与插值好的相关变量进行列合并。结果如下:

在这里插入图片描述

write.csv(miceOutput, "TJ_var8_1970-2022_2st_rf.csv",row.names = F):最后将得到的插值好的数据集输出为csv文件,行索引不加上。

1.4 校验

all(miceOutput$TEMmin <= miceOutput$TEMavr,na.rm = T) #TRUE
all(miceOutput$TEMavr <= miceOutput$TEMmax,na.rm = T) #TRUE
all(miceOutput$RHUmin <= miceOutput$RHUavr,na.rm = T) #FALSE 
miceOutput$TEMmin[miceOutput$TEMmin>miceOutput$TEMavr] <- miceOutput$TEMavr[miceOutput$TEMmin>miceOutput$TEMavr]
miceOutput$TEMavr[miceOutput$TEMavr>miceOutput$TEMmax] <- miceOutput$TEMmax[miceOutput$TEMavr>miceOutput$TEMmax] 
miceOutput$RHUmin[miceOutput$RHUmin>miceOutput$RHUavr] <- miceOutput$RHUavr[miceOutput$RHUmin>miceOutput$RHUavr]

这里需要说明:miceOutput$TEMmin类似这种是取数据框中列标签为$后的列名称的那一列,即取指定列标签名的所在列。

all(miceOutput$TEMmin <= miceOutput$TEMavr,na.rm = T):若TEMavr所在列全部大于TEMmin 所在列,那么返回True。按理返回True是正常的,因为TEMaver表示平均值,TEMmin表示最小值数据。na.rm表示在进行比较时忽略NA。(至于其他代码类似)

miceOutput$TEMmin[miceOutput$TEMmin>miceOutput$TEMavr] <- miceOutput$TEMavr[miceOutput$TEMmin>miceOutput$TEMavr]表示将最小值大于平均值的那部分最小值用平均值替代。(其他代码类似)

02 常量定义

这些常量会在后续的计算中使用到。

#2. constants
FUN.constants<-data.frame(
  pi,
  lambda	  <-	2.45,
  sigma	  <-	4.90E-09,
  Gsc	    <-	0.082,
  Roua     <-	1.2,
  Ca	      <-	0.001013,
  G	      <-	0,
  alphaA	  <-	0.14,
  alphaPT	<-	1.26,        #for Priestley-Taylor formula
  alphaSJ	<-	1.31,        #for Szilagyi-Jozsa formula
  alphaBS	<-	1.28,        #for Brutsaert-Strickler formula
  ap	      <-	2.4,         #in Penpan formula = 2.4
  b0	      <-	1,           #in Morton’s procedure = 1
  b1	      <-	14,          #in Morton’s procedure = 14 W.m^-2
  b2       <-	1.2,         #in Morton’s procedure = 1.2    

  epsilonMo<-	0.92,        #in Morton’s procedure = 0.92,      
  sigmaMo	<-	5.67E-08,    #in Morton’s procedure = 5.67e-08 W.m^-2.K^-4
  #end.constants in all places
  as   <- 0.25,  #no observed data in  China
  bs   <- 0.5    #no observed data in  China
)

通过data.frame()创建一个数据框,并将其赋值给变量FUN.constants。结果如下:

在这里插入图片描述

在对上述变量进行解释时需要对之前的几个变量进行说明:

RHUavr:平均相对湿度(Average Relative Humidity),相对湿度是指空气中水蒸气含量与在同一温度下空气能够容纳的最大水蒸气量的比例。它是影响蒸发潜能的重要因素之一

RHUmin:最小相对湿度(Minimum Relative Humidity),通常指一天中相对湿度的最低值,这个指标有助于了解日内湿度变化的范围。

SSD:日照时数(Sunshine Duration, 这是实际日照时数,h),指一天中太阳光直接照射地面的时间长度,是评估太阳辐射量和进一步估算蒸发潜能的一个重要指标。

TEMavr:平均温度(Temperature),温度直接影响蒸发速率,一般来说,温度越高,蒸发潜能越大。

TEMmax:最高温度(Maximum Temperature),一天中的最高气温,对蒸发量的计算同样重要。

TEMmin:最低温度(Minimum Temperature),一天中的最低气温,结合最高温度,可用于评估日温差对蒸散发的影响。

WINavr: 平均风速(Average Wind Speed,这里指2m高处风速, m/s),风速加快蒸发过程,因为它帮助移走饱和层(空气中水蒸气含量接近饱和的层面),使得更多的水分可以从水面或植被中蒸发。

由于上述常量部分包含蒸散发相关的代码,所以这里只解释与太阳辐射相关变量。

太阳辐射公式:
在这里插入图片描述

这是详细说明:
在这里插入图片描述
上述常量中:
as:0.25,回归常数,在阴天(n=0)时,表示到达地球表面的地球外辐射的透过系数;
bs:0.50,回归系数,在晴天(n=N)时,as+bs表示到达地球表面的地球外辐射透过率。

对于式中的Ra日地球外辐射,计算公式如下:

在这里插入图片描述
可以解释:

pi:即圆周率Π;

Gsc:太阳常数(为0.0820),单位为兆焦每平方米每分;

其余常数并未在太阳辐射中使用到,这里不予解释。

03 太阳辐射计算

#3. FUN.factor()
FUN.factor <- function(J, Lat, Elev, n, u2, Tmean, Tmax, Tmin, RHmax, RHmin){
  e_Tmax   <- 0.6108*exp(17.27*Tmax/(Tmax+237.3))
  e_Tmin   <- 0.6108*exp(17.27*Tmin/(Tmin+237.3))
  e_Tmean  <- 0.6108*exp(17.27*Tmean/(Tmean+237.3))
  es       <- (e_Tmax+e_Tmin)/2.0
  ea       <- (e_Tmin*RHmax/100+e_Tmax*RHmin/100)/2.0   #1???#2 ea <- (RHmax+RHmin)/200.0*es  
  delta_   <- 0.409*sin(2*pi*J/365-1.39)
  dr       <- 1+0.033*cos(2*pi*J/365)     
  phi_     <- pi/180*Lat  
  omega_s  <- acos(-tan(phi_)*tan(delta_))
  Ra       <- 24*60/pi*Gsc*dr*(omega_s*sin(phi_)*sin(delta_)+cos(phi_)*cos(delta_)*sin(omega_s))
  N        <- 24*omega_s/pi
  Rs       <- (as+bs*n/N)*Ra 
  
  Rso      <- (0.75+2E-05*Elev)*Ra
  Rnl      <- sigma*((Tmax+273.16)^4+(Tmin+273.16)^4)/2*(0.34-0.14*sqrt(ea))*(1.35*Rs/Rso-0.35)
  alpha_   <- 0.23
  Rns      <- (1-alpha_)*Rs
  Rn       <- Rns-Rnl
  DELTA_   <- 4098*0.6108*exp(17.27*Tmean/(Tmean+237.3))/(Tmean+237.3)^2
  gamma_   <- 0.000665*101.3*((293-0.0065*Elev)/293)^5.26
  return(cbind(es, ea, Ra, Rs, Rn, DELTA_, gamma_, delta_, dr, phi_, omega_s, N, e_Tmax, e_Tmin, e_Tmean))
}

这里包含了不止太阳辐射的计算,其中涉及太阳辐射Rs的代码式子包括:

  delta_   <- 0.409*sin(2*pi*J/365-1.39)
  dr       <- 1+0.033*cos(2*pi*J/365)     
  phi_     <- pi/180*Lat  
  omega_s  <- acos(-tan(phi_)*tan(delta_))
  Ra       <- 24*60/pi*Gsc*dr*(omega_s*sin(phi_)*sin(delta_)+cos(phi_)*cos(delta_)*sin(omega_s))
  N        <- 24*omega_s/pi
  Rs       <- (as+bs*n/N)*Ra 

delta_为计算的太阳磁偏角,数学公式为:

在这里插入图片描述
式中,J表示日序,取值范围为1到365或者366,1月1日取日序为1。

dr为计算的日地平均距离,数学公式为:

在这里插入图片描述

phi_计算的是弧度制的纬度,数学公式为:

在这里插入图片描述
omega_s为计算的日出时角,单位为弧度制,数学公式为:

在这里插入图片描述
Ra计算的是日地球外辐射,数学公式为:

在这里插入图片描述

计算出Ra之后,我们知道,太阳辐射计算公式为:

在这里插入图片描述
因此,这里需要计算出N,因为asbs为常数,n作为函数参数提供,Ra在刚刚的式子中进行了计算,而N的计算(下式中ws为前文的omega_s)如下:

在这里插入图片描述
如此,太阳辐射计算即全部完成。

在函数中,需要传入以下参数:

J:日序,取值范围为1到365或者366,1月1日取日序为1。
Lat:纬度(单位为°/度)
Elev:高程/海拔
n:实际日照时数
u2:2m高处风速,m/s
Tmean:平均温度
Tmax:最高温度
Tmin:最低温度
RHmax:最大相对湿度
RHmin:最小相对湿度

04 实例说明


#4. eg
TJ_rf<-read.csv("TJ_var8_1970-2022_2st_rf.csv")
J = NULL
data = TJ_rf[TJ_rf$Station==54619, ]
for (i in 1970:2022){
  tj = data[data$Year==i,]
  j = seq(1,length(tj$ID),1)
  J = c(J, j)
}

data = TJ_rf[TJ_rf$Station==54622, ]
for (i in 1974:2022){
  tj = data[data$Year==i,]
  j = seq(1,length(tj$ID),1)
  J = c(J, j)
}

TJ_rf<-cbind(TJ_rf,J)
TJ_rf_factor<-NULL
Lat             <- TJ_rf$Lat
Elev            <- TJ_rf$Elev_obs
J               <- TJ_rf$J
n               <- TJ_rf$SSD
u2              <- TJ_rf$WINavr
Tmin            <- TJ_rf$TEMmin
Tmax            <- TJ_rf$TEMmax
Tmean           <- (TJ_rf$TEMmax + TJ_rf$TEMmin)/2.0 #not a Temp
RHmax           <- 2*TJ_rf$RHUavr-TJ_rf$RHUmin
RHmin           <- TJ_rf$RHUmin
RHmean          <- TJ_rf$RHUavr
TJ_rf_factor<-cbind(TJ_rf,FUN.factor(J, Lat, Elev, n, u2, Tmean, Tmax, Tmin, RHmax, RHmin)) #return 25 values
write.csv(TJ_rf_factor,"TJ_var8_1970-2022_2st_rf_Rs.csv", row.names = F)

下述这部分代码意在读取csv文件,并分别筛选出站点ID为54619和54622(csv文件仅只有这两个站点的记录)的所有行记录,然后为每一行记录生成J即日序值。

TJ_rf<-read.csv("TJ_var8_1970-2022_2st_rf.csv")
J = NULL
data = TJ_rf[TJ_rf$Station==54619, ]
for (i in 1970:2022){
  tj = data[data$Year==i,]
  j = seq(1,length(tj$ID),1)
  J = c(J, j)
}

data = TJ_rf[TJ_rf$Station==54622, ]
for (i in 1974:2022){
  tj = data[data$Year==i,]
  j = seq(1,length(tj$ID),1)
  J = c(J, j)
}

下述代码将读取csv文件中的数据与前面计算的日序J进行列拼接,然后分别提取出各个需要的列变量,最后将其传入前面编写的FUN.factor函数中进行各种辐射的计算,包括本篇所说的太阳辐射。接着将得到的结果与前文数据框进行列合并,最后输出为csv文件。

TJ_rf<-cbind(TJ_rf,J)
TJ_rf_factor<-NULL
Lat             <- TJ_rf$Lat
Elev            <- TJ_rf$Elev_obs
J               <- TJ_rf$J
n               <- TJ_rf$SSD
u2              <- TJ_rf$WINavr
Tmin            <- TJ_rf$TEMmin
Tmax            <- TJ_rf$TEMmax
Tmean           <- (TJ_rf$TEMmax + TJ_rf$TEMmin)/2.0 #not a Temp
RHmax           <- 2*TJ_rf$RHUavr-TJ_rf$RHUmin
RHmin           <- TJ_rf$RHUmin
RHmean          <- TJ_rf$RHUavr
TJ_rf_factor<-cbind(TJ_rf,FUN.factor(J, Lat, Elev, n, u2, Tmean, Tmax, Tmin, RHmax, RHmin)) #return 25 values
write.csv(TJ_rf_factor,"TJ_var8_1970-2022_2st_rf_Rs.csv", row.names = F)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/461742.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子供应链的未来:电子元器件采购商城的洞察

电子供应链的未来将受到数字化技术、智能化制造和全球化贸易等趋势的深刻影响。在这一背景下&#xff0c;电子元器件采购商城将发挥越来越重要的作用&#xff0c;并提供以下洞察&#xff1a; 数字化转型&#xff1a; 电子元器件采购商城将更加注重数字化转型&#xff0c;通过引…

【计算机系统结构】重叠方式

&#x1f4dd;本文介绍 本文主要内容位计算机系统结构的重叠方式 &#x1f44b;作者简介&#xff1a;一个正在积极探索的本科生 &#x1f4f1;联系方式&#xff1a;943641266(QQ) &#x1f6aa;Github地址&#xff1a;https://github.com/sankexilianhua &#x1f511;Gitee地址…

不可变集合

2. 3. 如果键值对超过10个的话 优化之后 要生成不可变的集合直接使用copyof就可以

Python XML处理实战指南:从基础到高级技巧

Python XML处理实战指南&#xff1a;从基础到高级技巧 介绍XML基础XML的定义和特点XML结构组成命名空间&#xff08;Namespaces&#xff09;小结 Python中处理XML的库ElementTreeminidomlxml 使用ElementTree解析XML读取XML文件遍历XML元素查找特定元素修改XML文件 使用lxml处理…

除了「au revoir」,「再见」还能怎么说?柯桥成人学外语来银泰附近

1. Je dois y alle#15857575376r I have to go there Y there&#xff0c;意思是“我要走了”。 例如&#xff0c;”Moi, je dois y aller.” 对不起&#xff0c;我该走了。 如果你和同伴都要离开&#xff0c;那就可以说"On y va"&#xff0c;它相当于英语里…

C#集合和数据结构,随笔记录

C#集合和数据结构 System.Collections命名空间包含接口和类&#xff0c;这些接口和类定义各种对象&#xff08;如列表/链表、位数组、哈希表、队列和堆栈&#xff09;的集合 System.Collections.Generic命名空间&#xff1a; 所有集合都直接或间接基于ICollection接口 列表类集…

Redis数据结构对象(一)

对象 概述 Redis并没有直接使用简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合等这些数据结构来实现键值对数据库&#xff0c;而是基于这些数据结构创建了一个对象系统&#xff0c;这个系统包含字符串对象、列表对象、 哈希对象、集合对象和有序集合对象这五种类型…

Cesium 获取 3dtileset的包围盒各顶点坐标

Cesium 获取 3dtileset的包围盒各顶点坐标 /*** 获取 3dtileset的包围盒各顶点坐标, z 方向取高度最低的位置* param {*} tileset* param {*} options* returns* ref https://blog.csdn.net/STANDBYF/article/details/135012273* ref https://community.cesium.com/t/accurate-…

基于SpringBoot+Vue的IT博客管理系统

目录 一、绪论1.1 开发背景1.2 系统开发平台1.2.1 Java语言的简介1.2.2 MySQL的简介1.2.3 IntelliJ IDEA的简介 二、需求分析2.1 系统简介2.1.1 系统类型2.1.2 系统用法2.1.3 系统特点 2.2 需求分析2.2.1 系统设计任务2.2.2 系统设计目标2.2.3 系统设计步骤 三、系统设计3.1 用…

视频素材库大全高清素材必备网站,总有一个值得收藏!

喜欢制作短视频的朋友们&#xff0c;你们是否时常苦于寻找合适的视频素材库大全高清素材必备网站&#xff1f;今天&#xff0c;我为大家整理了五个超棒的短视频素材下载网站&#xff0c;希望能够为你们的视频创作提供更多灵感和选择&#xff01; 1.蛙学网&#xff1a; 蛙学网不…

qt可以信号触发信号(信号与槽)信号串联

使用场景&#xff1a;一大堆lineEdit要更新数据上面10几个QLineEdit,z&#xff0c;只要任意改一个数据我都要把所有数据封装成一个包 connect(ui.radar_name_, &QLineEdit::textChanged, ui.antenna_height, &QLineEdit::textChanged); connect(ui.antenna_height, &a…

裸机编程的几种模式、架构与缺陷。

大多数嵌入式的初学者都是从单片机裸机编程开始的&#xff0c;对于初学者来说&#xff0c;裸机编程更加直观、简单&#xff0c;代码所见及所得&#xff0c;调试也非常方便&#xff0c;区别于使用操作系统需要先了解大量的操作系统基础知识&#xff0c;调度的基本常识&#xff0…

【JavaEE Spring 项目】消息队列的设计

消息队列的设计 一、消息队列的背景知识二、需求分析核心概念⼀个⽣产者, ⼀个消费者N 个⽣产者, N 个消费者Broker Server 中的相关概念核⼼ API交换机类型 (Exchange Type)持久化⽹络通信消息应答 三、 模块划分四、 项⽬创建五、创建核心类创建 Exchange创建 MSGQUeue创建 B…

C语言数据结构基础笔记——树、二叉树简介

1.树 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 &#xff08;图片来源于网络&#xff09;…

计算机考研|王道四本书够吗?

如果你是跨考生&#xff0c;王道的四本书只能覆盖你需要的80% 如果你是计算机专业的考生&#xff0c;王道四本书可以覆盖你需要的90% 我已经说的很明显了&#xff0c;王道的内容覆盖不了408考研的全部大纲&#xff0c;有的知识点虽然在王道书上提到了&#xff0c;但是因为不是…

拿捏指针(二)

个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 目录 前言 数组与指针 数组名的理解 指针数组与数组指针 指针数组 数组指针 数组传参 一维数组传参的本质 二维数组传参的本质 二维数组…

【数据结构与算法】:选择排序与快速排序

&#x1f525;个人主页&#xff1a; Quitecoder &#x1f525;专栏&#xff1a;数据结构与算法 我的博客即将同步至腾讯云开发者社区&#xff0c;邀请大家一同入驻&#xff1a;腾讯云 欢迎来到排序的第二个部分&#xff1a;选择排序与快速排序&#xff01; 目录 1.选择排序1.…

【网站项目】325企业OA管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

SpringBoot启动后出现Please sign in页面

1. 问题 项目启动后&#xff0c;出现莫名其妙的页面&#xff0c;如下 2. 原因 当您启动 Spring Web 应用程序后出现 “Please sign in” 页面时&#xff0c;这通常是由于引用依赖Spring Security默认的身份验证方式导致的。 <dependency><groupId>org.springfr…

Element 选择季度组件

<template><el-dialogtitle"选择季度":show-close"false":close-on-click-modal"false":close-on-press-escape"false":visible"visiable"class"dialog list"append-to-body><div><div>&…