我用Python按照:https://ask.hellobi.com/blog/datasciencemeditation/7540,http://www.doc88.com/p-2089722981617.html。这两个链接实现门槛回归(没办法,没看到Python有什么库提供门槛回归方法),由于第2个链接里的论文根本没提到SCAD惩罚函数的样子,我就去搜索到了第一个链接。总而言之,现在我的确跑出来结果了,但是门槛值 c 的估计值竟然比实际存在的门槛变量的取值还大好多倍,这肯定不正确。。。
所以我怀疑是不是我对SCAD惩罚函数的理解有错误,总之我今天又谷歌,搜索到了http://vlambda.com/wz_wRtUGSimSJ.html。这篇文章,里面的SCAD惩罚函数又和第一个链接看到的不一样,我已经迷糊了
我的意思是,现在我搞不清楚SCAD是不是函数表达式弄错了,但不论是否弄错,我发现我不能理解SCAD如何把参数估计为0。参数估计为0就会将某段的回归全部系数估计为0,从而能直接告知这个分段不需要,这是第二个链接论文告诉我的。。。但反正,现在门槛 c 值就不对。。。门槛自变量的数据最大也才1W出头,而估计出的C竟然数倍于它们
以下是代码,其中pay_data_x为189*9的矩阵自变量数据,pay_data_y为因变量。M_c是分段,这里分了2段,先分别用pay_data_x的第2列数据的标准差和均值做分段门槛值的初始值(即第2列数据为门槛变量)
另外就是,是否有可能我对门槛值c的求导有错误??
分3段,故有9*3=27个参数,可以看到第2和第3段参数估计一模一样
[[ 2.21651758e+02 1.24799988e+04 1.24799988e+04]
[-2.70472227e-02 1.26663922e+08 1.26663922e+08]
[ 2.84548849e-02 3.16436052e+07 3.16436052e+07]
[ 3.82476892e-02 3.05133523e+07 3.05133523e+07]
[ 1.13002044e-02 2.92317240e+07 2.92317240e+07]
[ 8.44805488e-02 3.13574382e+07 3.13574382e+07]
[-1.01630661e-01 2.93887077e+07 2.93887077e+07]
[ 3.42105205e-02 3.08086230e+07 3.08086230e+07]
[ 7.84099476e+00 2.79222208e+07 2.79222208e+07]]
门槛值c:[[ 26632.39914284], [113303.41470849]]