平凡人's profile平凡人的视点PhotosBlogLists Tools Help

Blog


    8/29/2009

    R技术心得——概率密度估计

      R这个东西估计有很多人不熟悉,但搞统计的应该都对它不陌生。这确实是一个相当好用的统计环境。今天突发奇想,小小的说两句关于R的东西。
      R是一个计算环境,完全开源,所以也有很多人自己编出一堆奇怪的库来方便使用。最近在做一个模型的算法,里面涉及到了一个非常常规的问题,就是根基样本估计某一个点的概率密度。大概所有搞统计的人对这个应用都应该不陌生。
      对于一维样本来说,这当然不是什么困难的事情。在R里已经有了一个现成的函数density(),只要指定出目标向量,它就会给出这个样本的核密度估计。但是这个函数的结果是一个描述性的函数,通俗的说就是一堆密密麻麻的点,来勾勒出核密度函数的大概形状。要通过这个东西求出某一点的概率密度,显然还得再想一点办法。通常的方法就是用线性插值去逼近,R当然也会把这样的常用函数编出来。在R里线性插值有两个相关的函数,分别是approx()和approxfun(),他们最大的差别就是approxfun()的结果是一个函数,只要给出x值他就会根据插值的结果给出y值,所以这个函数用的更为广泛。
      比如要根据set这个数据集,求x点的概率密度,把结果放进y里,那么就应该是:
     y <- approxfun(density(set))(x)
      一维的情况当然非常简单,但二维的情况就麻烦的多了。想想直方图和网格的区别就明白了~但在R里,这当然也是有办法实现的,因为有很多不认识的同志为我们编好了现成的函数。
      二维核密度函数的估计是用kde2d(),这个函数在”MASS“这个库里,需要的话用linstall.packages('MASS')从R-project的源里下载,然后用library('MASS')载入以后才能使用。它的使用方法和结果与density()非常类似,所以我们同样得面临插值逼近的问题。然而二维的插值就复杂多了,我查了好久文献才在一个非常偏僻的库里找到一个非常偏僻的函数,实现二维双线性插值。这个函数就是interp.surface(),在"fields"这个库里。只要给出目标点的坐标,这个函数就可以估计出在该点的函数值。
      比如要根据(set1,set2)这个二元数据集估计出(x,y)点的概率密度,放到z里,就应该是:
     loc <- (x, y)
     z <- interp.surface(kde2d(set1, set2), loc)
      如果是三维函数……我就不知道该怎么弄了,因为随着维度的增加,计算难度可不是线性增长的。
      姑且先说这么多,以后有新的想法再写。
    8/2/2009

    无为之心与布尔乔亚情结的斗争

      不能否认,这样的题目一定会让很多人把我认作装B……但偶尔做一回标题党却也未尝不可。
      这个7月的天气不是烈日炎炎就是大雨瓢泼,我已经开始同情仍在军训的同志们了。貌似得以清闲的我,却仍然不免被不知何时被调遣的疑虑搅得惴惴不安,以至于拟定出游的计划也不得不一次又一次地被全无的兴致推迟了。
      然则这样无所事事的日子之中,却又让我无所事事的充实。每日来到学校似乎已经是一种功课了,但沿袭的却是许久没有上心的学业。我虽总是自诩怀着黄老无为的心境,日日念着《菜根谭》的修为,却始终无法抛去布尔乔亚的憧憬,甚至连安贫乐道这样的词语也羞于出口了。而我也只得在这样的纠结中,继续为着每天的衣食奔波劳碌,盼望着口袋中的小纸片能更厚实一点。顶着一个文艺青年的名义,总要在这样的纠结之中再缠上一团纠结,否则似乎不能体现将布尔乔亚发扬到底的精神,于是便有了在奔波劳碌中那知识分子化的抱怨,很酸,很含蓄……
      昨天和某小狐唠嗑,我戏曰:我不就是缺个妞儿么。某小狐驳道:那你倒是找个啊。我无心引出本人依旧单身的话题,以防许多人跳出来说我又是旧事重提,只是这让我猛然间发现,这样的无病呻吟似乎在单身人群中稍嫌泛滥,大抵是拖家带口的人们已经没有了文人的矜持了吧,我以为。看来房子、车子、票子这样俗人才谈论的话题,确实会让怀着无病呻吟心态的不靠谱青年们靠谱化,你看我最近诗词都写的少了……
      扯毕君子之心与布尔乔亚之追求,我决定关上网页,继续在Linux中踯躅于R的魅力了。