yzhlinscau的个人博客分享 http://blog.sciencenet.cn/u/yzhlinscau

博文

批量求解基于电导率的植物半致死温度

已有 1594 次阅读 2020-3-1 22:09 |个人分类:R|系统分类:科研笔记

1 问题的提出
问题:一批植物材料,设定了不同梯度的温度,每个处理重复3次,并测定了相对电导率,想计算各种基因型的半致死温度。
方法:采用文献《应用Logistic方程确定植物组织低温半致死温度的研究》的方法进行计算。

前言:很遗憾,R语言自带的nls函数(nls(ddl ~ SSlogis(temp, a, b, c))无法运行,主要缘故是数据问题。因此,根据查询的文献,从手动开始计算,到编程一次性完成。
2 文献所述求解方法
文献涉及的Logistic方程如下:
y=k/(1+a∗e(−b∗x))

问题改为涉及对参数k,a和b的求解,半致死温度的求解公式如下:
Lt50=lna/b


关键步:参考文献需要对原始的电导率作如下转换:
y′=(k−y)/y=a∗e(−b∗x)
上述方程进行对数转换:
lny′=lna−b∗x

进一步
lny′=ln(k−y)/y
式中,y是原始的相对电导率(去掉%的值),k=100。

通过lny′l即可对x做普通的线性回归,获得lna和b的值。
最后要求解k,采用等距离的3个y值求解,方法如下:
k=(y2^2∗(y1+y3)−2∗y1∗y2∗y3)/(y2^2−y1∗y3)


通过上述的步骤,即可获得Logistic方程的各项参数值。之后就是利用R语言编程的事了,以及如何实现批量分析的目的。

3 R语言编程求解
3.1 数据读取和变换
对原始的电导率数据做所需的对数转换和均值计算:

df2 <- readxl::read_excel('抗逆性.xls',sheet=1,skip=1)
df2$y <- log((100-df2$ddl)/df2$ddl)
df2a <- df2 %>% select(Clone,y,ddl,temp) %>% 
  group_by(Clone,temp) %>% summarise(dm=mean(ddl),ym=mean(y))



3.2 批量求解的函数

lgssf <- function(dat,mod=ym~temp,x=temp,y0=dm,tn=3:5,ts=3) {  
# mod: line regression  
# x: temperature, for plot  
# y0: orginal leakage, for plot  
# tn: used orginal leakage data, 3 points position  
# ts: orginal leakage variable    

x=deparse(substitute(x))  
y0=deparse(substitute(y0))    
m2 <- lm(mod,data=dat)    
tt <- summary(m2) 
r2 <- tt$r.squared  
Fv <- tt$fstatistic  
pv <- 1-pf(Fv[1],df1=Fv[2],df2=Fv[3])    
fit <- list()  
fit$r2 <- r2; fit$Fv <- Fv; fit$pv <- pv    
ln.a<-coef(m2)[1];a<-exp(ln.a)  
b<--coef(m2)[2]  
Lt50<-ln.a/b
  
  y1=dat[tn[1],ts];y2=dat[tn[2],ts];y3=dat[tn[3],ts]  
  k=(y2^2*(y1+y3)-2*y1*y2*y3)/(y2^2-y1*y3)    
  lgss.cof<-c(k,a,b,Lt50)  lgss.cof<-unlist(lgss.cof)  
  names(lgss.cof)<-c('k','a','b','Lt50')  
  lc<-lgss.cof<-round(lgss.cof,3)     
  equat<-paste0('y=',lc[1],'/','(1+',lc[2],'*exp^','(',lc[3],'*x))')    
  fig<-ggplot(dat, aes_string(x=x,y=y0))+geom_point()+    
  geom_smooth(method='auto',se=F)      
  res<-list(equat,lc[4],lgss.cof,fit)  
  names(res)<-c('equat','Lt50','coef','fit')  
  res$fig<-fig 
   return(res)
 }


3.3 运行程序和查看结果

res2a <- plyr::dlply(df2a,"Clone",lgssf)
> names(res2a) # 各植物材料的基因型代码
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9"

# 第一个基因型的结果
> res2a$`1`[c('equat','Lt50','fit')]
$`equat`[1] "y=21.713/(1+1.148*exp^(-0.127*x))"
$Lt50  
Lt50 
-1.089
$fit$fit$`r2`
[1] 0.8356973
$fit$Fv   
value    numdf    dendf 
20.34531  1.00000  4.00000
$fit$pv     
value 
0.01073532


图形查看res2a$`1`$fig:

Rplot.png


————————————————
版权声明:本文为CSDN博主「yzhlinscau」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yzhlinscau/article/details/104600675




https://wap.sciencenet.cn/blog-1114360-1221282.html

上一篇:家系模型之Echidna篇
下一篇:利用R语言简单的时间序列模型预测韩国、日本、伊朗和意大利的疫情趋势

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2021-12-7 03:13

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部