看板Statistics
标 题Re: [问题] R算间距cdf
发信站无名小站 (Wed Jan 30 00:22:03 2008)
转信站ptt!Group.NCTU!grouppost!Group.NCTU!wretch
※ 引述《[email protected] (= ="frailty..gggg XD)》之铭言:
> 我想先给定一个间距,然後让算每个间距的cdf值,但是pp的值却都是0?
> 若改成 pexp(brck[2],theta)-pexp(brck[1],theta)则可算出第一个值
> 请问下面的回圈是否有写错的?
> 谢谢
>
> for (i in 1:8){
> theta<-1/20
> brck<-c(0,9,18,27,36,45,54,63,72,200)
> pp<-numeric(11)
> pp[i]<-pexp(brck[i+1],theta)-pexp(brck[i],theta)
> }
>
这个回圈的计算除了如接话所指出
将第四行的 pp<-numeric(11) 改为 pp<-numeric(0)
然後放到回圈的外头就可执行外,
应还有可改进的.
首先, 第二与第三行是数值的设定储存, 无涉回圈计算,
所以应提至回圈外.
若检视第五行, 会发现所需作的差量计算, 是针对 pexp(..., theta) 的值;
而此 pexp() 的值是可以在回圈前就计算出来的.
(顺带一提, brck 共有十个值, 因此 pp 应有九个值, 而非八个!)
rate <- 1/20
brck <- c(0, 9, 18, 27, 36, 45, 54, 63, 72, 200)
prob <- pexp(brck, rate)
pp <- numeric(9)
for(i in 1:9)
pp[i] <- prob[i + 1] - prob[i]
其中, 我将原先命名为 theta 的改为 rate, 这直接对应到 pexp() 里的选项名称.
这改了似乎比原程式还多了一行, 但是细看一下, 就可发现第一至第三行可以合并为
prob <- pexp(c(0, 9, 18, 27, 36, 45, 54, 63, 72, 200), 1/20)
而第四至六行的回圈计算, 也可(或是应)利用 R 在向量计算上的能力
(其实整并第一至三行就是利用 R 在处理向量计算的能力) 改写为
pp <- prob[-1] - prob[-10]
就是将 prob 舍去第一个位置的值与舍去最後一个位置的值所得的两个向量相减.
由於这种将一向量的值作'後'减'前'的计算,
在统计方法中是蛮常用到的一个功能, 在 R 中有个 diff() 的内设函数.
所以整个计算可再简化为如下的一行即可:
pp <- diff(pexp(c(0, 9, 18, 27, 36, 45, 54, 63, 72, 200), 1/20))
当然, 先将资料存於 brck 的做法或应较好:
brck <- c(0, 9, 18, 27, 36, 45, 54, 63, 72, 200)
pp <- diff(pexp(brck, 1/20))
参考一下.
又, 顺带一提, 逗号後空一格, "<-" 的前後空一格, 以及程式的适当内缩,
都会让程式较易阅读, 也较能避免疏漏或错误, 当然也利於修改更正.
--
夫兵者不祥之器物或恶之故有道者不处君子居则贵左用兵则贵右兵者不祥之器非君子
之器不得已而用之恬淡为上胜而不美而美之者是乐杀人夫乐杀人者则不可得志於天下
矣吉事尚左凶事尚右偏将军居左上将军居右言以丧礼处之杀人之众以哀悲泣之战胜以
丧礼处之道常无名朴虽小天下莫能臣侯王若能守之万物将自宾天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦将知止知止可以不殆譬道之在天下210.66.0.241海
1F:推 DAVIDD0629:当初应该跟老师好好学的 囧 01/30 02:56
2F:推 bcs:受教了,大谢 01/30 14:24
3F:推 showfeb:用diff的指令,可以省去回圈 02/27 00:29