最近学到的R的一些技巧

前些时候和我一个打羽毛球的姐们一起做一个项目,要求处理一些本质上是小电影的数据。我现在算是发现,类似于imaging, movie, time course之类的”非传统”的数据分析现在越来越成为统计分析的主流了。

为了她这个项目,我决定写一个小package。出于练手的考虑,我决定采用面向对象编程,以下就是一些刚刚学到的心得。

  1. 生成一个叫做”movie”的类:

    setClass(Class="movie",
             representation(tmin="numeric",
                            tmax="numeric"),
             prototype(tmin=1),
             contains = "array"
    )
    

    这里面Class就是新的类的名字,contains是指的从array类继承而来,representation里头的两个值叫做slots,以后可以用amovie@tmin, amovie@tmax来获得。prototype相当于default value.

  2. 有了一个类,我们可以定义一个强制检查consisitency的函数:

    validity.movie <- function(object){
      if (length(dim(object)) !=3 ){
        return ("A movie object must contain two spatial dimensions and a temporal dimension!")
      } else if (dim(object)[3] !=object@tmax - object@tmin +1 )
        return ("tmax/tmin do not match the length of time.")
      TRUE
    }
    setValidity("movie", validity.movie)
    

    这个检查函数所做的就是要求该array必须是三维,而且最后一维(代表时间)的长度和tmin/tmax必须一致。

  3. 有了这个新的类,我们可以定义单独作用于此类的一些generic function:

    setGeneric("GetTlen", function(object) standardGeneric("GetTlen"))
    setMethod("GetTlen", "movie", function(object){
      object@tmax - object@tmin + 1
    })
    

    上面的代码生成了一个新的generic function “GetTlen”, 当它作用于movie的时候就给出这个movie的时长。其实我们还可以为这个新的类写一些非常标准的generic function, 比如说show/plot等等。

  4. 其它的技巧,暂时还没用上。等以后一边学,一边写。

除了OOP以外的心得:

  1. =R=的多维非参数回归的选择似乎不多(也许这不是=R=的问题)。看来看去,对付大型数据(我的一个movie object的维度是512x512x150 = 39,321,600个data points,占用300多兆内存)似乎还就只有 fields package提供的kernel smoothing的几个函数能handle. 以后我可以试试看gam,但是gam模型假定了一些线性性质,真正的数据未必有。至于loess(lowess), spline之类的速度太慢基本上完全不能用了。当然了,一个full rank的三维spline regression的变量数量可以是惊人的。所以,也许gam之类的半参数回归是唯一可行的办法。
  2. 做多维的clustering (unsupervised learning), kmean()的效率很高,高到让我吃惊的地步。Mclust则基本不能用。暂时还没实验别的比如说svn.
  3. GCV当然是标准的选择smoothing parameter的方法。但对于39M个数据点,leave-one-out CV是不可能的。我发现怎么所有的package里都没有比如说10-fold CV之类比较现实一点的方法?不过,手动写这么一个程序到也不难。

, ,

  1. #1 by bbbush on 十月 18, 2010 - 10:24 上午

    R 用什么载入 movie 类型的数据啊?有专用的包,还是先提取到某个数据文件里了?

    • #2 by qiuxing on 十月 19, 2010 - 3:09 上午

      好像真没有。最接近的是一个分析medical imaging的包,叫做EBImage. 所以我只好自己写了一个小package来读这种数据。

  2. #3 by ahmadhir on 十月 18, 2010 - 4:46 下午

    huvitav

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: