R语言中计算Probability integral transform(PIT)的工具及相关问题咨询
Copula拟合中PIT计算的R语言相关问题
一、需求背景
我有四组由四个相依随机变量生成的随机样本,要做copula拟合,需要计算Probability Integral Transform (PIT)。已知通过估计每个变量的边际CDF再执行PIT,能得到[0,1]区间上的均匀边际分布,但想知道R语言里有没有现成的集成命令。
二、isodistrreg包pit函数的参数疑问
我了解到isodistrreg包中有pit()函数,语法是pit(predictions, y, randomize = TRUE, seed = NULL),但搞不懂参数的作用:为什么同时需要predictions和数值向量y?只输入随机数据y不能得到PIT吗?我的理解哪里错了?
误区纠正
这个pit()函数是用来给预测分布做PIT校验的,和你为Copula拟合做的边际CDF变换不是一回事:
predictions是模型输出的预测分布(比如每个观测对应的预测CDF集合、分位数矩阵),y是实际观测值- 它的核心作用是验证预测分布的校准度——如果预测准确,PIT结果应该服从均匀分布
你要的是直接用原始数据的边际CDF转换自身观测值,得到均匀边际样本,这个场景下不需要预测分布输入,所以这个函数不适合你的需求。
三、现有替代方法的缺失值问题及其他解决方案
我现在用的替代方法是:
- 用
ecdf()函数从数据中获取CDF; - 生成[0,1]范围内的均匀随机数;
- 用分位数函数对均匀样本做CDF逆变换。
但原始数据有缺失值和NaN,运行时出现错误:
Error in quantile.default(matrixdata[, 1], unigf) : missing values and NaN's not allowed if 'na.rm' is FALSE
虽然可以设置na.rm=TRUE,但想知道其他解决方案。
其他可行方案
- 缺失值插补:先用均值、中位数,或者
mice包的多重插补方法对原始数据的缺失值填充,再计算ecdf和分位数变换,能避免直接删失带来的样本量损失 - 自定义带缺失值处理的ecdf:先过滤掉每个变量的缺失值,用非缺失子集估计ecdf,再用这个ecdf转换该变量的所有观测(缺失值位置保留NA即可)
- 结合Copula包的缺失值处理:如果缺失值比例不高,可先对每个变量的非缺失数据做边际变换,再用Copula包自带的缺失值处理逻辑(比如成对删除)完成拟合
内容的提问来源于stack exchange,提问作者Userhanu
相关产品推荐
相关产品推荐

