You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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就是你要的格式:

VariablePSI
age50.00000
age53.00000
off.set.term4.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:29:04