[问题] 可靠度分析求 tp 值

楼主: strp (GlRoEvEeN)   2017-05-03 14:49:50
[问题类型]:
程式咨询(我想用 R 做某件事情,程式已经写完了!但有一小部分觉得很奇怪)
[软件熟悉度]:
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
我的目的是利用 for 循环,找出符合设定式子的 tp 值
p 可以是 0.01, 0.05, 0.1, 0.5,所以会有 t0.01, t0.05, t0.1, t0.5 四个结果
因为只有 t0.5 的部分会出问题,所以以下仅针对 t0.5 来做书写
式子如下:
(其中 q, a, b 均为 MLE,且为已知)
tp0.5 <- NULL
for (tp in 1:1400000) {
if ( abs( pgamma(q, a*(tp*0.0000001)^b, rate = 1) -0.5 ) <= 0.000001 ) {
tp0.5 <- tp*0.0000001
}
}
tp 会设计成这样,主要是把区间割的细一点,让 pgamma 的值逐渐变大
大到与 0.5 的误差小于等于 0.000001 时,输出该 tp*0.0000001 值
就可以算出 t0.5 了!
以上单独的求法是不会有问题的,可以算出 t0.5
但我真正想求的,是透过 1000 次 Bootstrap,来得到 t0.5 的信赖区间
每一次 Bootstrap 的步骤如下
Step1:用真实资料的 MLE 去生成一笔资料 (其中 MLE 已知)
Step2:再利用 Step1 生成的资料,透过我的模型,去估计 MLE*
Step3:利用 Step2 的 MLE* 去算 t0.5 (然后盖到循环外的 NULL 向量去)
所以当 Bootstrap 跑完后,会得到 1000 个 t0.5
使用的程式与以上范例相同,仅修改循环内的名称而已
但是!!!
最后发现...这 1000 个 t0.5 里面,有些值是 NA (大约有 62 个)
也就是,那几次循环内,并没有求出 t0.5
我有将这些产生 NA 的 MLE* 抓出来看,都没有问题,都有值
然后再利用这些 MLE* 重新在用上面提供的程式去计算 t0.5,发现还是求不出来
但奇怪的是,如果我不用循环条件去逼近 t0.5,而是单纯直接给定 tp
却都算得出来,因为我们想要的 t0.5 会在 0.11~0.13 之间
这区间内大大小小的值我都给过了,都满 ok 的
但是在 Bootstrap 循环下就是求不出来!这让我匪夷所思
[程式范例]:
如同以上例子提供,只是该程式会放在 Bootstrap 循环内
[环境叙述]:
与此问题无关
[关键字]:
tp, t0.5, Bootstrap, MLE
再麻烦各位版友抽空解惑,万分感谢。
作者: a78998042a (Benjimine)   2017-05-04 00:16:00
step1:看下来意思是假设资料是gamma,然后估计他若是gamma的参数,再用给定估计参计下的gamma以有母数booststrap生成资料step2:透过某个model估计出MLE(是gamma的likelihood ?step3:optim先不论理解正确与否,但下面写说,这个过程没问题,有问题的是程式的输出结果,不过没有 真实资料 跟假定model应该没有办法重现你的问题?还是请直接提供整个程式?能重现错误也不会理解错误?
作者: x88776544pc (龙飞五丈原)   2017-05-04 00:41:00
从 NA 来猜的话,那 62 个 a 是负的吗?
作者: a78998042a (Benjimine)   2017-05-04 13:29:00
你好,谢谢补充,因为没有足够重现现象的条件,而过程看起来没有错误,只能猜测一下。怀疑是,你生成的过程是否没有setseed(set.seed(100))导致你重复验证时,其实是用不同的估计值,所以有了错误的误解?(会这样怀疑是因为上面写,NA""大约""有62),是否先将bh做成一个matrix,将所有结果存下来,再重新进行验证?
作者: x88776544pc (龙飞五丈原)   2017-05-04 15:22:00
如果 code 都没问题,即循环中没有一次符合 if 条件你可以试试用 min 取代 <0.000001 去验证
作者: a78998042a (Benjimine)   2017-05-04 16:44:00
seed是加在整个loop外部,所以每次生成的资料仍不同,目的是重现相同结果。

Links booklink

Contact Us: admin [ a t ] ucptt.com