R语言演示对没有吸收状态的马尔科夫链分析

马尔科夫链既往我在系列文章《手把手带你复现一篇一区9.1分肌少症和马尔科夫链》的文章已经有过介绍,它的特点是:"未来只取决于现在,与过去无关"。主要研究的是状态和概率的变化。比如我在手机打字:你nih,会出现很多选项:你好,你和,你还等等,这就是软件统计了咱们打各个字符的概率,这个就是马尔科夫链的一个应用。自然语言处理:用马尔科夫链生成文本(比如根据前一个词预测下一个词)。

在既往文章中咱们介绍的是由吸收状态的马尔科夫链,问题来了,什么是吸收状态的马尔科夫链?这个就是相当于有一个结局变量,比如在《手把手带你复现一篇一区9.1分肌少症和马尔科夫链》这篇文章中死亡是它的结局变量,分析了肌少症在不同时期的转换最后死亡的关系,没有结局变量也是能做的,研究的是协变量对概率转换的影响,下面我来演示一下

先导入数据和R包

r 复制代码
library(scitable)
library(ggscitable)
library(tidyverse)
setwd("E:/公众号文章2025年/charls+马尔科夫链")
bc2 <-read.csv('bcmsm.csv',header=T)
str(bc2)

这个是个非常简单的数据,而且是模拟数据,不对临床操作产生建议,time是时间,state这里是我自定义的,我把肾功能的肌酐按低到高,把肾功能分成了3个状态,然后看这三个状态转换的概率,drinkl:是否饮酒。这里我们仍然使用一阶的马尔科夫链,

下面咱们进行分析,其实很简单,和之前的参数差不多,添加一个参数death_state=F就可以了

r 复制代码
out2<-sci_msm(data=bc2,ID="ID",time = "time",state = "state",digits = 7,death_state=F,
              username=username,token=token)

咱们把相关数据提取出来

r 复制代码
tb2<-out2[["tb2"]]

看下转移人数

r 复制代码
out2[["statetable"]]

看下不同年份的转移率,这里没有吸收状态,要定义一个观察年限,咱们这里是长年限是4年,所以我定义成4年

r 复制代码
probability.msm(out2,time = c(2,4),tot = 4)

结果还生成了平均时间和总停留时间,下面咱们来看下喝酒对肾功能转换的影响,在cov这里把喝酒添加进去

r 复制代码
out3<-sci_msm(data=bc2,ID="ID",time = "time",state = "state",digits = 7,death_state=F,cov="drinkl",
              username=username,token=token)

基础的分析和前面一样,我来介绍概率分析,假设我想知道喝酒对状态1(就是没有肾病患者)的肾功能转换影响,state=1表示观察状态1的转变,没有吸收状态要指定观察总时间tot=4,

r 复制代码
#没有吸收状态要指定观察总时间tot=4,
out4<-probability.msm(out3,time = c(1,2,3,4),cov="drinkl",state=1,tot=4)
r 复制代码
提取数据
data5<-out4[["data"]]

上图可以看到各种转变,假设我对中间的1转成2感兴趣

r 复制代码
data5$cov<-as.factor(data5$cov)
data5$cov<-factor(data5$cov,labels = c("nodrinkl", "drinkl"))
names(data5)<-c("State11","State12","State13","t","cov")
colors <- c("nodrinkl" = "#FFD1DC", "drinkl" = "#FF4D4D")

绘图

r 复制代码
ggplot(data5, aes(x = t, y = State12, color = cov, group = cov)) +
  geom_point(size = 5) +
  geom_line(size = 1.2) +
  scale_color_manual(values = colors) +
  labs(title = "State1 → State2", x = "observation interval", y = "possibility ") +
  theme_minimal() +
  theme(
    legend.title = element_text(size = 12, face = "bold"),
    legend.text = element_text(size = 10),
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
    axis.text.x = element_text(size = 12),
    axis.text.y = element_text(size = 12),
    legend.position = c(0.85, 0.2),
    panel.grid.minor = element_blank()
  ) +
  guides(color = guide_legend(title = NULL))

可以看到,相对于没有喝酒,喝酒更容易(更高概率)导致肾功能向恶化转变(模拟数据不构成临床指导)

相关推荐
爱装代码的小瓶子20 小时前
【c++与Linux基础】文件篇(5)- 文件管理系统:
linux·开发语言·c++
马猴烧酒.20 小时前
【团队空间|第十一天】基础功能实现,RBAC权限控制,ShardingSphere详解
java·开发语言·数据库
fengxin_rou20 小时前
从 String 到 Zset:Redis 核心数据结构全解析及排行榜应用
java·开发语言·redis·多线程
Re.不晚20 小时前
Java进阶之路--线程最最详细讲解
java·开发语言
梵刹古音20 小时前
【C语言】 数组基础与地址运算
c语言·开发语言·算法
wuguan_20 小时前
C#/VP联合编程之绘制图像与保存
开发语言·c#
Howrun77720 小时前
C++_错误处理
开发语言·c++
bubiyoushang88820 小时前
基于MATLAB的局部特征尺度分解(LCD)实现与优化
开发语言·matlab
hgz071020 小时前
堆内存分区
java·开发语言·jvm
索荣荣20 小时前
SpringBoot Starter终极指南:从入门到精通
java·开发语言·springboot