如何从R的segmented模型对象中提取PSI值并转为数据框?
提取Segmented GLM模型的断点(PSI)到Tibble/Dataframe
嗨,我来帮你搞定这个提取断点的问题!你不用手动去翻xlevels,segmented包其实提供了专门的函数来提取断点值,而且用这个官方方法比直接访问对象内部结构更可靠,不会因为包的版本更新导致代码失效。
步骤1:用psi()函数提取断点值
segmented包的psi()函数是专门用来获取模型断点估计值的,直接传入你的拟合模型对象就行:
# 提取断点值,返回一个列表,每个元素对应一个分段变量 psi_list <- psi(glm.fitted.segmented)
步骤2:转换为你需要的Tibble格式
用tidyverse的函数把列表转换成长格式的tibble,正好符合你想要的表格结构:
psi_tibble <- psi_list %>% # 将列表转换为列:Variable是变量名,PSI是对应的断点值列表 enframe(name = "Variable", value = "PSI") %>% # 展开PSI列的列表元素,每个断点值占一行 unnest(PSI)
运行完上面的代码后,psi_tibble就是你要的格式:
| Variable | PSI |
|---|---|
| age | 50.00000 |
| age | 53.00000 |
| off.set.term | 4.369448 |
为什么直接用glm.fitted.segmented$psi找不到?
segmented模型对象的结构里,断点值并不是作为顶级元素存储的,xlevels$psi是对象内部的存储位置,但官方更推荐用psi()函数来提取——它会自动处理模型中的断点估计,包括如果需要的话可以加CI=TRUE参数获取置信区间,比手动访问内部结构更稳妥。
完整测试代码
把所有步骤放在一起,验证一下:
library(segmented) library(tidyverse) set.seed(1) # 创建数据 Y<-c(13,21,12,11,16,9,7,5,8,8) X<-c(74,81,80,79,89,96,69,88,53,72) age<-c(50.45194,54.89382,46.52569,44.84934,53.25541,60.16029,50.33870, 51.44643,38.20279,59.76469) dat=data.frame(Y=Y,off.set.term=log(X),age=age) # 拟合初始GLM glm.fit=glm(Y~age+off.set.term,data=dat,family=poisson) # 拟合分段模型 glm.fitted.segmented <- segmented(glm.fit, seg.Z=~age + off.set.term, psi = list(age = c(50,53), off.set.term = c(4.369448))) # 提取并转换断点 psi_list <- psi(glm.fitted.segmented) psi_tibble <- psi_list %>% enframe(name = "Variable", value = "PSI") %>% unnest(PSI) # 查看结果 print(psi_tibble)
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

