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 formulaalphaSJ	<-	1.31,        #for Szilagyi-Jozsa formulaalphaBS	<-	1.28,        #for Brutsaert-Strickler formulaap	      <-	2.4,         #in Penpan formula = 2.4b0	      <-	1,           #in Morton’s procedure = 1b1	      <-	14,          #in Morton’s procedure = 14 W.m^-2b2       <-	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 placesas   <- 0.25,  #no observed data in  Chinabs   <- 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.0ea       <- (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/piRs       <- (as+bs*n/N)*Ra Rso      <- (0.75+2E-05*Elev)*RaRnl      <- sigma*((Tmax+273.16)^4+(Tmin+273.16)^4)/2*(0.34-0.14*sqrt(ea))*(1.35*Rs/Rso-0.35)alpha_   <- 0.23Rns      <- (1-alpha_)*RsRn       <- Rns-RnlDELTA_   <- 4098*0.6108*exp(17.27*Tmean/(Tmean+237.3))/(Tmean+237.3)^2gamma_   <- 0.000665*101.3*((293-0.0065*Elev)/293)^5.26return(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/piRs       <- (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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探索C与C++的混合编程

实现混合编程的技术细节 混合使用C和C可能由多种原因驱动。一方面&#xff0c;现有的大量优秀C语言库为特定任务提供了高效的解决方案&#xff0c;将这些库直接应用于C项目中可以节省大量的开发时间和成本。另一方面&#xff0c;C的高级特性如类、模板和异常处理等&#xff0c;…

mysql数据库中查询重复数据和去重数据

文章目录 1.查找重复数据2. 查到重复组的唯一数据3.删除重复数据4.注意重复的内容和删除的记录数是否一致 1.查找重复数据 select gene_entrez_id,count(*) a from diag_gene GROUP BY gene_entrez_id HAVING a > 12. 查到重复组的唯一数据 原理 分组后如果组内多个数据…

跨境电商干货|如何在Snapchat上做电商?

Snapchat是一个与用户互动与创意内容为主的平台&#xff0c;也因其广阔的受众群体广受跨境电商卖家的喜爱&#xff0c;成为跨境出海的热门渠道之一。本文将为大家分享&#xff0c;要在Snapchat上进行电子商务&#xff0c;可以遵循以下步骤&#xff1a; 1、创建商业账户 在Snap…

卷积的九大变体算法

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 引言 卷积神经网络&#xff08;CNN&#xff09;的核心在于其多样化的卷积技术&#xff0c;每种技术针对不同的应用和性能需求有着独特的优势。逐…

力扣46. 全排列

Problem: 46. 全排列 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 回溯可以理解为是在对一个多叉树的操作 1.回溯结束条件&#xff1a;当决策路径的长度等于nums数组的长度时&#xff0c;将当前的结果添加到二维结果集res中&#xff1b; 2.每一次决策的选择处…

Qt 图形视图 /基于Qt示例DiagramScene解读图形视图框架

文章目录 概述从帮助文档看示例程序了解程序背景/功能理清程序概要设计 分析图形视图的协同运作机制如何嵌入到普通Widget程序中&#xff1f;形状Item和文本Item的插入和删除&#xff1f;连接线Item与形状Item的如何关联&#xff1f;如何绘制ShapeItem间的箭头线&#xff1f; 下…

穿越半个世纪,探索中国数据库的前世今生

引言 在数字化潮流席卷全球的今天&#xff0c;数据库作为 IT 技术领域的“活化石”&#xff0c;已成为数字经济时代不可或缺的基础设施。那么&#xff0c;中国的数据库技术发展经历了怎样的历程&#xff1f;我们是如何在信息技术的洪流中逐步建立起自己的数据管理帝国的呢&…

Hadoop大数据应用:HDFS 集群节点扩容

目录 一、实验 1.环境 2.HDFS 集群节点扩容 二、问题 1.rsync 同步报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;已部署&#xff09; SecondaryNameNode &#xff08;已部署&#xff09; Resourc…

海川润泽AI机器视觉仪系列产品,助推“人工智能+”打开新质生产力的大门

3月5日&#xff0c;第十四届全国人民代表大会第二次会议开幕。国务院总理李强在政府工作报告&#xff0c;提出大力推进现代化产业体系建设&#xff0c;加快发展新质生产力。深入推进数字经济创新发展&#xff0c;制定支持数字经济高质量发展政策&#xff0c;积极推进数字产业化…

零基础自学C语言|动态内存管理

✈为什么要有动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int a 0;//在栈空间上开辟四个字节char arr[10] { 0 };//在栈空间上开辟10个字节的连续空间但是上述的开辟空间的方式有两个特点&#xff1a; 空间开辟大小是固定的。数组在申明的时候&#xff0c;必须…

【开源】SpringBoot框架开发公司货物订单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

Cap2:Pytorch转TensorRT(上:Pytorch->ONNX)

文章目录 1、pytorch导出onnx模型2、使用onnxruntime推理onnx模型3、精度对齐4、总结 深度学习框架种类繁多&#xff0c;想实现任意框架之间的模型转换是一件困难的事情。但现在有一个中间格式ONNX&#xff0c;任何框架模型都支持转为ONNX&#xff0c;然后也支持从ONNX转为自身…

案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-先导篇)

专栏系列文章&#xff1a; 2024高级系统架构设计师备考资料&#xff08;高频考点&真题&经验&#xff09;https://blog.csdn.net/seeker1994/category_12593400.html 案例分析篇01&#xff1a;软件架构设计考点架构风格及质量属性 案例分析篇11&#xff1a;UML设计考…

疫情网课管理系统|基于springboot框架+ Mysql+Java+Tomcat的疫情网课管理系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 ​编辑 学生功能模块 管理员功能 教师功能模块 系统功能设计 数据库E-R图设计 lun…

Ubuntu上搭建TFTP服务

Ubuntu上搭建TFTP服务 TFTP服务简介搭建TFTP服务安装TFTP服务修改配置文件 重启服务 TFTP服务简介 TFTP是一个基于UDP协议实现的用于在客户机和服务器之间进行简单文件传输的协议&#xff0c;适用于开销不大、不复杂的应用场合。TFTP协议专门为小文件传输而设计&#xff0c;只…

虚拟游戏理财 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 在一款虚拟游戏中生活&#xff0c;你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。 现有一家Bank&#xff0c;它提供有若干理财产品m&#xff0c;风险及…

【PHP安全】PHP伪协议

PHP伪协议&#xff1a; file:// #访问本地文件系统http:// #访问HTTPs网址ftp:// #访问ftp URLphp:// #访问输入输出流zlib:// #压缩流data:// #数据&#xff08;RFC 2397&#xff09;ssh2:// #security shell2expect:// #处理交互式的流glob:// #查找匹配的文件路径phar:// #P…

Siamese Network(孪生神经网络)详解

Siamese和Chinese有点像。Siam是古时候泰国的称呼&#xff0c;中文译作暹罗。Siamese也就是“暹罗”人或“泰国”人。Siamese在英语中是“孪生”、“连体”的意思&#xff0c;这是为什么呢&#xff1f;十九世纪泰国出生了一对连体婴儿&#xff0c;当时的医学技术无法使两人分离…

软件功能测试内容有哪些?湖南长沙软件测评公司分享

软件功能测试主要是验证软件应用程序的功能&#xff0c;且不管功能是否根据需求规范运行。是通过给出适当的输入值&#xff0c;确定输出并使用预期输出验证实际输出来测试每个功能。也可以看作“黑盒测试”&#xff0c;因为功能测试不用考虑程序内部结构和内部特性&#xff0c;…

Orange3数据预处理(清理特征组件)

清理特征 移除未使用的属性值和无用的属性&#xff0c;并对剩余的值进行排序。 输入 数据: 输入数据集 输出 数据: 过滤后的数据集 命名属性定义有时包含在数据中不出现的值。即使原始数据中没有这种情况&#xff0c;数据过滤、选择示例子集等操作也可能移除…