R语言nlme、nlmer、lme4用(非)线性混合模型non-linear mixed model分析藻类数据实例...

原文链接:http://tecdat.cn/?p=23426

混合线性模型,又名多层线性模型(Hierarchical linear model)。它比较适合处理嵌套设计(nested)的实验和调查研究数据点击文末“阅读原文”获取完整代码数据)。

相关视频

序言

此外,它还特别适合处理带有被试内变量的实验和调查数据,因为该模型不需要假设样本之间测量独立,且通过设置斜率和截距为随机变量,可以分离自变量在不同情境中(被试内设计中常为不同被试)对因变量的作用。

简单的说,混合模型中把研究者感兴趣的自变量对因变量的影响称为固定效应,把其他控制的情景变量称为随机效应。由于模型中包括固定和随机效应,故称为混合线性模型。无论是用方差分析进行差异比较,还是回归分析研究自变量对因变量的影响趋势,混合线性模型比起传统的线性模型都有更灵活的表现。

非线性混合模型就是通过一个连接函数将线性模型进行拓展,并且同时再考虑随机效应的模型。

非线性混合模型常常在生物制药领域的分析中会用到,因为很多剂量反应并不是线性的,如果这个时候数据再有嵌套结构,那么就需要考虑非线性混合模型了。

本文中我们用(非)线性混合模型分析藻类数据。这个问题的参数是:已知截距(0日值)在各组和样本之间是相同的。

数据

outside_default.png

用lattice和ggplot2绘制数据。

xyplot(jitter(X)~Day, groups=Group)

outside_default.png

ggplot版本有两个小优势。1. 按个体和群体平均数添加线条[用stat_summary应该和用xyplot的type="a "一样容易]);2.调整点的大小,使重叠的点可视化。(这两点当然可以用自定义的 panel.xyplot 来实现 ...)

## 必须用手进行汇总
ggplot(d,aes(x=Day,y=X,colour=Group))

outside_default.png

从这些图片中得出的主要结论是:(1)我们可能应该使用非线性模型,而不是线性模型;(2)可能存在一些异方差(在较低的平均值上有较大的方差,好像在 X=0.7的数据有一个 "天花板");看起来可能存在个体间的变化(特别是基于t2的数据,其中个体曲线近乎平行)。然而,我们也将尝试线性拟合来说明问题。

使用nlme

用lme的线性拟合失败。

LME <- lme(X ~ 1, random = ~Day|Individual, data=d)

outside_default.png

如果我们用control=lmeControl(msVerbose=TRUE))运行这个程序,就会得到输出,最后是。 

outside_default.png

可以看到考虑到组*日效应的模型也失败了。

LME1 <- lme(X ~ Group*Day, random = ~Day|Individual, data=d)

outside_default.png

我试着用SSfpl拟合一个非线性模型,一个自启动的四参数Logistic模型(参数为左渐近线、右渐近线、中点、尺度参数)。这对于nls拟合来说效果不错,给出了合理的结果。

nlsfit1 <- nls(X ~ SSfp)
coef(nlsfit1)

outside_default.png

可以用gnls来拟合组间差异(我需要指定起始值

我的第一次尝试不太成功。

gnls(X ~ SSfpl)

outside_default.png

但如果我只允许asymp.R在各组之间变化,就能运行成功。

params=symp.R~Group

绘制预测值。

g1 + geom_line()

outside_default.png

这些看起来很不错(如果能得到置信区间就更好了--需要使用delta法或bootstrapping)。

dp <- data.frame(d,res=resid(gnlsfit2),fitted=fitted(gnlsfit2))
(diagplot1 <- ggplot(dp,aes(x=factor(Individual),y=res,colour=Group))+geom_boxplot(outlier.colour=NULL)+scale\_colour\_brewer(palette="Dark2"))

outside_default.png

除了7号样本外,没有很多证据表明个体间的变异......如果我们想忽略个体间的变异,可以用

anova(lm(res~Individual))

outside_default.png

大的(p\)值可以接受个体间不存在变异的无效假设...

更一般的诊断图--残差与拟合,同一个体的点用线连接。可以发现,随着平均数的增加,方差会逐渐减小。

plot(dp,(x=fitted,y=res,colour=Group))

outside_default.png


点击标题查阅往期内容

outside_default.png

非线性混合效应 NLME模型对抗哮喘药物茶碱动力学研究

outside_default.png

左右滑动查看更多

outside_default.png

01

outside_default.png

02

outside_default.png

03

outside_default.png

04

outside_default.png

我不能用nlme来处理三个参数因组而异模型,但如果我只允许asymp变化,就可以运行。

nlme(model=list(fixed=with(c(asymp.R,xmid,scale,asymp.L),...)

右侧渐近线中的方差估计值是非零的。

outside_default.png

加入随机效应后,参数根本就没有什么变化。 

outside_default.png

最大的比例差异是3.1%(在比例参数中)。

nlmefit2 <- update(list(asyR+xmd+scal+asp ~1),start )

我们可以通过AIC或似然比检验来比较模型

AICtab(nlmefit1,nlmefit2,weights=TRUE)

outside_default.png

anova(nlmefit1,nlmefit2)

outside_default.png

可以做一个F测试而不是 LRT(即考虑到有限大小的修正)。

pchisq(iff,df=2,lower.tail=FALSE)

outside_default.png

outside_default.png

##分母非常大的F检验。
pf(diff/2,df1=2,df2=1000000,lower.tail=FALSE)

outside_default.png

我们不知道真正相关的df,但上面的总结表明df是40。 

outside_default.png

nlmer

我想现在可以为nlmer得到正确的模型规范,但我找不到一个方便的语法来进行固定效应建模(即在这种情况下允许一些参数因组而异)--当我构建了正确的语法,nlmer无法得到答案。

基本的RE模型(没有群体效应)运行良好。

nlmer(X ~ SSfpl(Day, asy, as, x, s) ~asy|Indi,)

根据我的理解,人们只需要构建自己的函数来封装固定效应结构;为了与nlmer一起使用,该函数还需要计算相对于固定效应参数的梯度。这有点麻烦,但可以通过修改派生函数生成的函数,使之稍微自动化。

  1. 构建虚拟变量:

mm <- model.matrix(~Group,data=d)
grp2 <- mm\[,2\]
  1. 构建一个函数来评估预测值及其梯度;分组结构是硬编码的。

deriv(~A+((B0+B1\*grp2+B2\*grp3-A)/(1+exp((x-xmid)/scale)
  1. 通过插入与传递给函数的参数名称相匹配的行来查看所产生的函数,并将这些参数名称分配给梯度矩阵。

L1 <- grep("^ +\\\.value +<-")
L2 <- grep("^ +attr\\\(\\\.value",)
eval(parse(text))

尝试一下拟合:

nlmer(X ~ fpl(Day, asym, as, asymp, asR3, xmi, sca) ~as|Indi,start =  list(nlpars)),data=d)

outside_default.png

失败了(但我认为这是由于nlmer本身造成的,而不是设置有什么根本性的问题)。为了确定,我应该按照同样的思路生成一个更大的人工数据集,看看我是否能让它工作起来。

现在我们可以用稳定版(lme4.0)得到一个答案。

结果不理想

fixef(nlmerfit2)

outside_default.png

range(predict(nlmerfit2))

outside_default.png

我不能确定,在nlmer中是否有更简单的方法来做固定效果。

AD模型生成器

我们还可以使用AD模型生成器来解决这个问题。它可以处理更复杂的模型,比如拟合更多参数的群体效应。

部分原因是我对ADMB的熟悉程度较低,这有点费劲,最后我通过循序渐进的步骤才成功。

最小的例子

首先尝试没有随机效应、分组变量等。(即等同于上面的nls拟合)。)

##设置数据:调整名称,等等
d0 <- c(list(nobs=nrow(d)),as.list(d0))
##起始值:调整名称,增加数值
names(svec3) <- gsub("\\\.","",names(svec3))  ## 移除点
svec3$asympR <- 0.6 ## 单一值
## 运行 
do_admb("algae0",data,params,run.opts)

结果不错

outside_default.png

固定效应模型

现在尝试用固定效应分组,使用上面构建的虚拟变量(也可以使用if语句,或者用R[Group[i]]的for循环中的R值向量,或者(最佳选择)为R传递一个模型矩阵...)。我们必须使用elem_div而不是/来对两个向量进行元素除法。

model1 <- "
参数部分向量 pred(1,nobs) // 预测值向量Rval(1,nobs) //预测值过程部分pred = as+elem(Rval-asy,1.0+exp(-(Day-xmid)/scal) 
"

试着用模型矩阵来代替它。

model1B <- "
参数部分向量 pred(1,nobs) // 预测值向量Rval(1,nobs) //预测值过程部分pred = asym+ele(Rv-asy,1.0+exp(-(Da-xmi)/sc)) 。
"

当然,在参数相同的情况下,也可以工作。

随机效应

现在添加随机效应。回归函数并没有完全实现随机效应模型(尽管这应该在即将到来的版本中被修复),所以我们用公式减去(n/2 log({RSS}/n)),其中RSS是残差平方和。

model2 <- "
参数部分向量 pred(1,nobs) // 预测值向量Rval(1,nobs) //预测值过程部分pred = asym+elemf = 0.5\*no\*log(norm2(X-pr)/n)+norm2(R)。
"

outside_default.png

由于ADMB不处理稀疏矩阵,也不惩罚循环,如果将随机效应实现为(i=1; i<=nobs; i++) Rval[i] += Rsigma*Ru[Group[i]],效率会略高,但我是懒人/我喜欢矩阵表示的紧凑性和可扩展性.

现在我们终于可以测试R以外的参数的固定效应差异了。

model3 <- "
参数部分向量 prd(1,nobs) // 预测值向量Rl(1,nobs) // 预测值向量 scalal(1,nobs)向量xmal(1,nobs)sdror opr(1,nobs) //输出预测值程序部分Rval = XR\*Rve+Rsma\*(Z*Ru)。xmval = Xd*xdvec;....f = 0.5\*nobs\*log(norm2(X-pred)/nobs)+norm2(Ru)
"

结果:

outside_default.png

summary(admbfit3)

outside_default.png

有一个非常大的AIC差异。如上文所示,对nlme拟合的似然比F测试是作为一种练习......

对于该图,最好是按组指定参数重新进行拟合,而不是按基线+对比度进行拟合。

fit3B <- do_admb(,data,params,re,run.opts=run.control)
plot2(list(cc),intercept=TRUE)

outside_default.png

现在我们对标准化的问题很困扰,所以(经过一番折腾)我们可以在不同的面板上重新画出群体变化的参数。

outside_default.png

诊断图

##放弃条件模式/样本-R估计值diagplot1 %+% dp2

outside_default.png

也许这暗示了两个实验组中更大的差异?

拟合与残差

diagplot2 %+% dp2

outside_default.png

叠加预测(虚线):

g1 + geom_line

outside_default.png

如果能生成平滑的预测曲线(即对中间的日值),那就更好了,但也更繁琐。

结论

  • 从参数估计中得出的主要结论是,第三组下降得更早一些(xmidvec更小),同时下降得更远(Rvec更低)。

似然分析

计算一个( sigma^2_R ) 似然函数的代码并不难,但运行起来有点麻烦:它很慢,而且计算在置信度下限附近的几个点上出现了非正-无限矩阵;我运行了另一组值,试图充分覆盖这个区域。

lapply(Rsigmavec,fitfun)
## 尝试填补漏洞
lapply(Rsigmavec2,fitfun)

带有插值样条的剖面图和似然比检验分界线。 

outside_default.png

在sigma^2_R 上的95%剖面置信区间是{0.0386,0.2169}。

我没有计算过,但转换后的剖面图(在对应于偏离度与最小偏离度的平方根偏差的 y )上,所以二次剖面将是一个对称的V)显示,二次近似对这种情况相当糟糕 ...

ggplot(sigma,sqrt(2*(NLL-min(NLL))+geom_point()

outside_default.png

扩展

  • 更多地讨论分母df问题。参数引导法/MCMC?

  • 我们可以尝试在xmid和scale参数中加入随机效应。

  • 在组间或作为X的函数的方差(无论是残差还是个体间的方差)中可能有额外的模式。

outside_default.png

点击文末“阅读原文”

获取全文完整代码数据资料。

本文选自《R语言nlme、nlmer、lme4用(非)线性混合模型non-linear mixed model分析藻类数据实例》。

outside_default.png

outside_default.png

点击标题查阅往期内容

R语言混合线性模型、多层次模型、回归模型分析学生平均成绩GPA和可视化

R语言线性混合效应模型(固定效应&随机效应)和交互可视化3案例

R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析教育留级调查数据

R语言 线性混合效应模型实战案例

R语言混合效应逻辑回归(mixed effects logistic)模型分析肺癌数据

R语言如何用潜类别混合效应模型(LCMM)分析抑郁症状

R语言基于copula的贝叶斯分层混合模型的诊断准确性研究

R语言建立和可视化混合效应模型mixed effect model

R语言LME4混合效应模型研究教师的受欢迎程度

R语言 线性混合效应模型实战案例

R语言用Rshiny探索lme4广义线性混合模型(GLMM)和线性混合模型(LMM)

R语言基于copula的贝叶斯分层混合模型的诊断准确性研究

R语言如何解决线性混合模型中畸形拟合(Singular fit)的问题

基于R语言的lmer混合线性回归模型

R语言用WinBUGS 软件对学术能力测验建立层次(分层)贝叶斯模型

R语言分层线性模型案例

R语言用WinBUGS 软件对学术能力测验(SAT)建立分层模型

使用SAS,Stata,HLM,R,SPSS和Mplus的分层线性模型HLM

R语言用WinBUGS 软件对学术能力测验建立层次(分层)贝叶斯模型

SPSS中的多层(等级)线性模型Multilevel linear models研究整容手术数据

用SPSS估计HLM多层(层次)线性模型模型

outside_default.png

outside_default.png

outside_default.png

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

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

相关文章

使用Python进行Base64编码和解码

假设您有一个想要通过网络传输的二进制图像文件。您很惊讶对方没有正确接收该文件 - 该文件只是包含奇怪的字符&#xff01; 嗯&#xff0c;您似乎试图以原始位和字节格式发送文件&#xff0c;而所使用的媒体是为流文本而设计的。 避免此类问题的解决方法是什么&#xff1f;答…

【Vue3】组件递归

【Vue3】组件递归 实现效果 通过传入一个数字&#xff0c;实现数字次循环 父组件 <script setup> import { ref } from "vue"; import RecursionMe from "./components/RecursionMe/index.vue";const level ref(0);const add () > level.val…

接口自动化测试 —— JMeter断言基本使用

断言 断言&#xff1a;就是让程序判断预期结果和实际结果是否一致 注意&#xff1a;请求发起成功了&#xff0c;不代表着一定符合预期的结果。 JMeter中常用断言 响应断言 JSON断言 持续时间断言 响应断言 步骤&#xff1a;&#xff1a;线程组——HTTP取样器——断言——…

解决springboot项目中的groupId、package或路径的混淆问题

对于像我一样喜欢跳跃着学习的聪明人来说&#xff0c;肯定要学springboot&#xff0c;什么sevlet、maven、java基础&#xff0c;都太老土了&#xff0c;用不到就不学。所以古代的聪明人有句话叫“书到用时方恨少”&#xff0c;测试开源项目时&#xff0c;编译总是报错&#xff…

Linux-Centos7安装Docker

文章目录 一、前言二、Docker安装1、Docker及系统版本2、Docker的自动化安装3、Docker手动安装3.1、卸载Docker&#xff08;可选&#xff09;3.2、设置源仓库3.3、Docker安装3.4、Docker启动3.5、验证是否安装成功3.5.1、拉取镜像3.5.2、查看镜像3.5.3、运行镜像 3.6、删除Dock…

http和https的区别?

什么是 HTTP&#xff1f; HTTP是一种互联网数据传输协议&#xff0c;用于在网络服务器和客户端之间进行数据传输。作为万维网的基础&#xff0c;HTTP协议允许网络浏览器向网络服务器发送请求&#xff0c;服务器则会返回响应。HTTP协议基于文本&#xff0c;因此传输的数据是人类…

多源最短路径算法:Floyd-Warshall算法分析

文章目录 图的邻接矩阵 一.Floyd-Warshall算法思想(基于动态规划)二.Floyd-Warshall算法接口笔记附录:单源最短路径--Bellman-Ford算法1.Bellman-Ford算法接口核心部分2.Bellman-Ford算法接口 图的邻接矩阵 namespace Graph_Structure {//Vertex是代表顶点的数据类型,Weight是…

Approaching (Almost) Any Machine Learning Problem中译版

前言 Abhishek Thakur&#xff0c;很多kaggler对他都非常熟悉&#xff0c;2017年&#xff0c;他在 Linkedin 发表了一篇名为Approaching (Almost) Any Machine Learning Problem的文章&#xff0c;介绍他建立的一个自动的机器学习框架&#xff0c;几乎可以解决任何机器学习问题…

JY901B智能9轴加速度计陀螺仪角度传感器

今日学习使用JY901B智能9轴加速度计陀螺仪角度传感器 本文会先使用上位机获取数据作演示&#xff0c;后介绍它的数据表发送原理。 文章提供详细的原理讲解&#xff0c;测试工程下载&#xff0c;代码讲解&#xff0c;本人有多注释的习惯&#xff0c;希望对大家有帮助。 我的J…

【LeetCode】剑指 Offer <二刷>(4)

目录 题目&#xff1a;剑指 Offer 09. 用两个栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 10- I. 斐波那契数列 - 力扣&am…

FFmpeg5.0源码阅读——FFmpeg大体框架

摘要&#xff1a;前一段时间熟悉了下FFmpeg主流程源码实现&#xff0c;对FFmpeg的整体框架有了个大概的认识&#xff0c;因此在此做一个笔记&#xff0c;希望以比较容易理解的文字描述FFmpeg本身的结构&#xff0c;加深对FFmpeg的框架进行梳理加深理解&#xff0c;如果文章中有…

Linux 常见命令操作

一、目录管理 1.1 列出目录 ls # ls 命令 # -a 参数&#xff0c;查看全部的文件&#xff0c;包括隐藏的文件 # -l 参数&#xff0c;列出所有的文件&#xff0c;包括文件的属性和权限&#xff0c;不显示隐藏文件 [rootlocalhost /]# ls bin boot dev etc home lib lib64…

C# Dapper 操作Oracle数据库

nuget安装内容 1.配置连接字符串 OracleConnectionString这个可用 {"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","…

前几天写的博客被选中进入【CSDN月度精选】榜单

小收获&#xff0c;记录一下&#xff0c;哈哈 这个貌似是CSDN给的排名和得分&#xff1a;

中东 Shopify 如何使用 Bytebase 构建一站式数据库开发工作流

公司简介 Salla 是一家 2016 年成立&#xff0c;位于沙特麦加的自建站电商平台。 作为中东 Shopify&#xff0c;其最大的特点是支持阿拉伯语建站&#xff0c;并且提供更多适应中东地区特点的本地化服务。截止目前&#xff0c;已有 47,000 家店铺入驻 Salla&#xff0c;商品销售…

云计算环境中高性能计算的挑战与对策

文章目录 云计算中的高性能计算挑战1. 资源竞争&#xff1a;2. 网络延迟&#xff1a;3. 数据传输效率&#xff1a;4. 虚拟化开销&#xff1a;5. 节点异构性&#xff1a; 高性能计算在云计算环境中的对策1. 定制化虚拟机镜像&#xff1a;2. 弹性资源调整&#xff1a;3. 高效数据…

springCloud整合Zookeeper的时候调用找不到服务

SpringCloud整合Zookeeper的时候调用找不到服务 首先&#xff0c;我们在注册中心注册了这个服务&#xff1a; 然后我们使用RestTemplate 调用的时候发现失败了&#xff1a;找不到这个服务&#xff1a; 找了很多资料发现这个必须要加上负载才行 BeanLoadBalanced //负载publi…

_数字矩阵

题目&#xff1a;一个3阶的数字矩阵如下&#xff1a; 1 2 3 8 9 4 7 6 5 现在给定数字n(1<n≤20)&#xff0c;输出n阶数字矩阵。 思路&#xff1a; 放出一条好玩的贪吃蛇&#xff0c;按照右下左上的顺序吃蛋糕&#xff0c;一边吃蛋糕&#xff0c;一边拉数字&#xff1b…

高级IO(select、poll、epoll)

在介绍本文之前&#xff0c;先提出一个问题 什么是IO&#xff1f; 等数据拷贝 1.等 - IO事件就绪&#xff08;检测功能成分&#xff09; 2.数据拷贝 高效的IO就是&#xff1a;单位时间&#xff0c;等的比重越小&#xff0c;IO的效率越高 五种IO模型 IO模型&#xff1a; 阻塞式…

微服务通信[HTTP|RPC同步通信、MQ异步通信]

概念 A服务调用B服务,B服务调C服务,C服务调D服务,即微服务之间的通信(也可以叫微服务之间的调用) HTTP同步通信 一种轻量级的通信协议,常用于在不同的微服务之间进行通信,也是最简单的通信方式使用REST ful为开发规范&#xff0c;将服务对外暴露的HTTP调用方式为REST API(如GET…