谢益辉 2012-04-30T20:19:22-07:00 xie@yihui.name 分段回归的拐点连续性 2012-04-30T00:00:00-07:00 谢益辉 http://yihui.name/cn/2012/04/break-points-in-regression 我翻了一下,上一次写跟统计有关的话题已经是2010年的事情了,多数时候,这里写的都是(计算机)技术类与生活类的话题,于是我又想起来很久以前有客官说,你还不如改成“Keep on eating”算了。废话少说,言归正传。

最近有客官问:

在分段线性回归中,转折点的连续性是必须的吗?

意思是这样,下图中,两段直线应该接着呢(实线),还是可以各走各的(虚线)?

set.seed(123)
# 真实模型
x = sort(runif(100))
y = 2 + 1 * x + 4 * (x > 0.5) + 3 * (x - 0.5) * (x > 0.5) + rnorm(100)
par(mar = c(4, 4, 0, 0), family = "serif", mgp = c(2, 1, 0))
plot(x, y, pch = 20, col = "darkgray")
# 斜率不同,截距限制
fit1 = lm(y ~ 1 + x + I((x - 0.5) * (x > 0.5)))
lines(x, fitted(fit1), lwd = 2, col = 2)
# 斜率不同,截距也不同
fit2 = lm(y ~ 1 + x + I(x > 0.5) + I((x - 0.5) * (x > 0.5)))
lines(x, fitted(fit2), lwd = 2, lty = 2)

plot of chunk linmod

虚线线段的中间一段不应该被画出来,我偷了个懒画上去了,本来应该是间断的。连与不连,归根结底,只不过是回归设计阵要不要多一列的问题。这是线性回归中经典的模型比较问题,上面fit2是全模型,fit1是取消一个限制的模型,自由度之差为1,残差平方和之差除以1,再除以全模型的残差平方和除以相应自由度(88/96),就是F统计量,P值也就出来了。R里面所谓的anova()函数,就是干这事儿的:

# 两个嵌套模型做F检验
anova(fit1, fit2)
## Analysis of Variance Table
## 
## Model 1: y ~ 1 + x + I((x - 0.5) * (x > 0.5))
## Model 2: y ~ 1 + x + I(x > 0.5) + I((x - 0.5) * (x > 0.5))
##   Res.Df RSS Df Sum of Sq    F  Pr(>F)    
## 1     97 155                              
## 2     96  88  1      66.6 72.6 2.2e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 

这里因为我们设计的真实模型就是两部分直线斜率和截距在0.5前后都不同,所以这里F检验高度显著,说明加上截距限制条件不合理。道理很简单:除非简约模型和全模型没有显著差异,我们只能认为全模型相对“好”一些。

然而,线性模型本身就是对现实的简化。按照上面的想法,其实我们还需要看更复杂的全模型,否则不能认为线性模型就是合适的模型,比如可以考虑非线性模型。复杂模型是没有尽头的,如果要一个个检查下去,那大家都不用干活了。2008年我在COS写了一篇简单的LOWESS文章,如今我仍然可以把它搬出来,因为LOWESS实在是回归模型中的战斗机,它是模型复杂与简约的很好平衡。前面的直线回归可以看作LOWESS的特例,如下fit4。我们可以构造一个相对复杂的LOWESS模型(span参数取小一些),然后和一个简单的模型比较,如:

fit3 = loess(y ~ x, span = 0.2)
fit4 = loess(y ~ 1 + x + I(x > 0.5) + I((x - 0.5) * (x > 0.5)), span = 1, 
    degree = 1)
par(mar = c(4, 4, 0, 0), family = "serif", mgp = c(2, 1, 0))
plot(x, y, pch = 20, col = "darkgray")
lines(x, fitted(fit3), lwd = 2, col = 2)
lines(x, fitted(fit4), lwd = 2, lty = 2)

plot of chunk loess-comparison

anova(fit3, fit4)
## Model 1: loess(formula = y ~ x, span = 0.2)
## Model 2: loess(formula = y ~ 1 + x + I(x > 0.5) + I((x - 0.5) * (x > 0.5)), span = 1, degree = 1)
## 
## Analysis of Variance:   denominator df 82.38
## 
##        ENP  RSS F-value Pr(>F)
## [1,] 15.16 83.2               
## [2,]  4.02 87.7   0.321   0.99

P值很大,这毫不奇怪,因为真实模型就是按照两段直线构造的。弯弯曲曲的复杂模型无法打败简单模型,此时我们可以有点底气说两个线段的直线回归可能是对数据的一个恰当描述。

客官的第二个问题是:

转折点怎么确定?

好问题。我对学术研究其实没多大兴趣,所以懒得去文献堆里翻找。我总觉得很多研究是把问题复杂化了,这种文献海让我觉得窒息。如果是我,第一步肯定是画平滑曲线,然后再去结合具体事件背景去决定。如前面的数据用ggplot2很容易分组画图:

library(ggplot2)
qplot(x, y) + geom_smooth()  # 总趋势

plot of chunk loess

qplot(x, y, group = x > 0.5) + geom_smooth()  # 按0.5前后分组

plot of chunk loess

显然所有数据放一条线上建模不合适。作为普通青年的我,到此就止步了(所以我离学术还十万八千里)。不过作为二青年想起一件事,如果不知道转折点,而靠不断推移转折点、新建模型、比较模型得来的转折点,是否有多重比较的嫌疑?比如先试0.2为转折点,再试0.3,……,一直试到0.9,看哪个模型跟全模型比起来没有显著差异。或者说,如果本来真实模型中不存在这样一个转折点,而通过这种方法找出转折点的概率有多大?我估计我八成问了一个很二的问题,应该早有人研究过了。做个模拟应该也不难。


本文是我第一次在博客里尝试knitr包,点击这里看源文件以及编译代码。关于knitr,待我下回在COS详细分解(预览);昨天刚提交0.5版本到CRAN,最终实现了我的初步理想:会R就会动态生成报告,把LaTeX扔一边儿去吧!

]]>
春游记 2012-04-08T00:00:00-07:00 谢益辉 http://yihui.name/cn/2012/04/spring-tour 昨天琢磨着要出门溜达一圈去,今儿个早上起床开着自行车就去河边了。河边都是树林,溜达了一个时辰往回走,手机拿出来随手拍两张。

这个小河湾和我家那边有些许相像,小时候在这种浅浅的河里站着,水从脚上流过,总让我感觉水没动,而是我被河底载着在往相反的方向移动,所以在河里总是站不稳,晕得慌,舅舅家里的哥哥姐姐就解释这是盐吃少了,那时候屁大点孩子,当然别人说什么都信;我不是牛顿,被苹果砸就能砸出万有引力,只能信了这个缺盐理论,嗨,想当年,相对论离哥其实就一步之遥,谢因斯坦就在河里捞鱼摸虾中没影了。

河滩

大江东去

站在河堤上感觉腿给刺扎了,低头一看,一根不知名的草木棍子,枯了半截,上面一支新芽,下面一排刺。

某文艺青年正在研究手机相机设置,突然身后传来一阵鸟叫,叫的节奏跟狗似的,开始没注意,但我在拨弄相机给刺棍子拍写真时,那鸟狗好像一直冲我叫,于是我转身一看,霍哦,原来是只松鼠:

本村松鼠多,但松鼠叫还真是头一次听到(今天在林子里还头一次听见啄木鸟的声音了,果真是好鼓手,那敲的节奏)。那松鼠就趴在一根枯树枝上,冲我叫个不停,我不知道它是什么意思,反正我看着很欢乐,于是给它录了一段

它高高在那儿爬上爬下叫个不停,于是我跟它来了一段对话,具体说的是什么,各位客官自己猜好了。最神奇的是,本来它在哪儿乱叫,后来我说五个字,它也说五个字,松鼠都会数数了,这可真是了不得了:

游记完毕。

]]>
归去来兮 2012-03-23T00:00:00-07:00 谢益辉 http://yihui.name/cn/2012/03/as-years-go-by 每次写新的日志之前要先清理一下旧日志,因为搬家把很多文章的格式都弄乱了,尤其是几乎所有的图片链接都成了死链接,都得重新传,所以写得越来越慢。有客官对此还专门分析了我的博客写作数据,发现我的篇数越来越少,字数越来越多,间隔越来越长。比如下图是我的相邻日志日期间隔,最高的那个点就是我说要从WP搬家到Jekyll之后等待的时间,从2011年的最后一篇到2012的第一篇足足过了三个多月:

日志间隔时间

开会后跟腾飞聊网站这些事儿,这厮小时候肯定有一篇课文没背好,就是《小猫钓鱼》。我一直相信热心必须有耐心相伴才能成事;COS团队里有时候有人因为白天聊了一些宏图大业的事情而激动得半夜睡不着觉,我对这种现象的第一反应往往是怎么维持这种热情。几年前我在论坛贴了一篇丰子恺的《渐》(美其名曰“文化建设”),这也是我这几年反复读反复引用的文章;道理极其朴素,但把它读进心里不容易。

前些日子我请范总点评一组幻灯片,范拎出里面一句话,曰“投资的成就根本是哲学的成就”。我搞不清楚什么技术分析或量化分析,也不知道什么哲学,不过这句话听起来很符合我的胃口。


我用“归去来兮”作标题,和陶渊明没关系,只不过是我去年11月想的一个标题而已。一个五年多没联系的师弟突然来信,让我顿时有种恍如隔世的感觉,于是拟题归去来。那时候我还在远大前程协会混迹,挂名副会长,其实就是网管,然后一起拎着讲座海报去各个宣传栏里贴。这师弟是协会的骨干分子,最深的印象就是整天熬夜,只要我早上在路上看见他,大多都是头发蓬乱熬完夜从楼里走出来。他找到我的原因是因为看了COS主站上侯瑀的文章,这事儿就有点趣了,因为他不是统计系的,一个非统计系的工作人士跑来COS看我们的文章,说明我们单篇文章的影响力还是挺深远的。侯瑀同志真是激励了不少人啊。这是从COS找到我的,还有一个更久以前一个从小轩哥的博客找到我的十来年没联系的高中同学,这个更让我不得其解。人生不见,动如参商。

五年前我说SVG太牛了,当时称浏览器支持还很欠缺,连Firefox对SVG动画支持都不太好;五年后,Chrome浏览器都已经出来了,大多数浏览器都支持SVG了。现在我开始研究D3,它画图的一个重要媒介就是SVG,而且动画的语法非常简单。Chrome自带的控制台也很牛,可以直接在浏览器内用JS代码操纵HTML或SVG元素,感觉跟用R差不多了。

四年前我看到Processing很惊叹,也提到那位大神把Processing翻译为JavaScript库,前些天有客官在我那篇日志下留言,我突然发现如今这个JS库已经成长为一个大网站,还有各种在线编辑器,再次激起学习欲望。

七八年前我看到UCLA的一些统计软件教程,觉得做得挺不错;如今他们的R教程已经开始用我的knitr包进行改写,让网页和R代码无缝结合,直接从源代码编译为带结果的HTML页面输出,无需任何复制粘贴。我觉得他们的志愿者劳动应该发扬光大再上新台阶,因此决定带一队人马去帮忙把这个网站好好整一整,也算是对免费资源贡献者的回报。

四年前我在不莱梅第一次见到AT&T的Simon、Debby和现在ISU的老板们,两年前周老师溜达到我的网站约书,两个月后我在北京第一次见到卢大编辑,去年通过老板支持和卢大编辑牵线去纽约参加Strata会议,顺便就去AT&T溜达一圈,又见了Simon和Debby,由D接待。后面二十字暂按下不表。

五年前我脑子抽风写了个animation包,纯属为了好玩,第二年去德国溜达一圈,第二年冬天开始第一届中国R语言会议(今年第五届),第三年上半年中奖,第三年下半年来了爱姆斯村办大学。第五年就此事给ICSA灌了一篇水,并把编辑大人Yan老师拐进COS主站。

COS主站一直有一个问题困扰着我,就是我们没有合适的logo标志图片,等了三年,我们等来了李龑,操起家伙解决了我们的问题,从此我们有了统计之印。COS成员这些年来来去去,偶尔会看见论坛上有注册了五年才第一次发言的会员;还有曾经有辉煌灌水战绩的会员去而复归,比如大家都熟悉的colinisstudent;还有主力管理员如无痕那小子,高考完就混迹论坛,后随我一起做网站苦力,现在已经从美帝溜完一圈回朝了,而我们的新管理员们也在奔美帝。

去年G_will留言说可以看看《Rework》,现在我已经看完别人寄给我的这本书,觉得还挺有收获的,不过总觉得观点有点偏激,让我心里又萌生了一些矛盾;同时寄来的还有我喜欢的德鲁克,这两本书风格当然截然不同,一个是叛逆后进,一个是经典大师,孰是孰非,仍然是小马过河的问题。若按照老式的一份耕耘一份收获原则,Rework看起来很轻浮,道理一看就懂,公交车加饭后几天就翻完了,所以可能真的只是一时的噱头;德鲁克读起来则慢得多,因为不得不停下来琢磨里面的逻辑,经常看了后面忘了前面,也许会更有收获。无论如何,让事实去检验吧。

九年前,奶奶过世。二十年前她还让我们兄弟几个大的让着小的,从手帕里拿给我们两毛钱去买乒乓球,爷爷用锯子给我们锯球拍;十三年前她从我卧室窗户递给我腊肠带去学校;十年前我从北京回家她还在外面晒太阳。


上上篇日志说到我在整理过去日志的时候发现四点问题,方方同学颠儿颠儿冒出来说“木有啊,很实在啊”。我板上钉几颗钉子试试:五年前我自以为是过度嘲笑群众大学网站技术,后来一位网管大人不知从链过来,纠正本小子的狂妄。六年前给高校统计论坛报告,现在看来简直是屁都不懂,还瞎拽洋文,现在我还记得当时讲完去吃饭的时候一位(可能是北师的)师姐在电梯里问我局部多项式的事情,我胡乱搪塞了几句,仿佛很简单似的。五年前对自由度的解释忿忿不平,暴跳发日志一篇,有晕死的客官评论说“深深感觉到博主有些牛气,有些自我膨胀,有些胡言乱语”,可惜当年那小子心高气傲根本没当回事。无聊的事情回复也一大堆,没话找话狗尾续貂。


用分秒的跨度来看,一切都没变化,无关痛痒。以五年十年为单位来看,因果事理的轮廓就开始凸显。去年年底看到《鹧鸪天》一首,转发给COS全站:

记得窗前槐树吗?几回树下过家家。泥巴盘子泥巴碗,塑料摇车塑料娃。
儿时梦,散如沙,谁知转瞬即天涯。老房拆了树还在,一到夏天开白花。

这就是时间的力量。我在首页放了一首龚自珍的词,气场太强大了,当时狠狠震了我一把,千古声名,百年担负。

]]>
欲写已忘言 2012-02-20T00:00:00-08:00 谢益辉 http://yihui.name/cn/2012/02/many-things-to-nothing 博客是不能断的东西,断久了就真不知道要写什么了,因为脑子已经超出键盘一大截,鸡零狗碎的装了一大堆。太云的网站标题说优秀是一种习惯,这就是个习惯问题,要做好一件事情,不能指望大脑来控制(人脑从来都不靠谱),而是要把一件事情做成习惯。比如总是不写东西,慢慢地时间就被其它事情占据,久而久之,成了习惯,就再也写不动了。这周老板下山去了,于是更加放肆折腾自己的事情(代价是要上的课都留给我上了)。这次又得像上次一样,各种残篇残念摘抄揉一起,所以难免意识流。

  1. 今年村里天气有点奇特,用摔跤这个指标来衡量的话,我这个冬天只滑过一次。总体来说,尽管这地方雪大,但对冬天却没什么感觉,因为暖气太足,我总是想要是地球发生气候突变,美帝很可能先灭绝——环境太娇惯了。在英语环境中,雪似乎完全变成了一个纯粹的物理对象,什么感觉都没有。《九阴真经》中铁掌帮帮主上官南念了一首《三国》中的小诗(我是先看电视剧后知道出处的),让我印象深刻:

    一夜北风寒,万里彤云厚;
    长空雪乱飘,改尽江山旧。
    仰面观太虚,疑是玉龙斗;
    纷纷麟甲飞,顷刻遍宇宙。
    骑驴过小桥,独叹梅花瘦。

    这里没法骑驴过小桥,只能开车过大桥,而且开车还得小心雪。前些日子有位大人在本小子的办公室白板上就这雪景题诗一首:

    流落美帝苦,漫天雪花舞。
    闲来无事做,不如煮香菇。

    按小说的规矩,一般在墙上题诗都是要造反的,不过这位是送香菇的,善哉善哉。一样是雪,有人鳞甲飞,有人煮香菇,各人有各人的逍遥自在。

  2. 巨子

    我放出knitr之后,意外收到了很多巨子的回复,让我颇为惊喜。比如Venables,也就是MASS那位大人。收到V大人来信并不是最神奇的事情,而是他居然学过中文,过年那天他还用拼音跟我说新年快乐、恭喜发财。最近Harrell大人也在折腾knitr,已经下定决心用knitr重写他的书,跟这样的巨子交流就很爽快,因为他是明白人,受过Sweave的常年折磨,精确地知道怎样的软件才能让作者免于折磨,这样的人就是knitr最好的客户;很多人不像我受过几年Sweave折磨(最后才揭竿而起),所以无法理解knitr的优势所在;还有更可怕的情况是,有些人已经被Sweave的暗黑技巧深深毒害了思维方式,这样的人就更难说服了。还有一位Coombes大人,有些客官可能熟悉他,前两年Duke的癌症研究丑闻背后的“侦探”之一就是他,他一直宣扬可重复的研究,重头工具之一便是Sweave,本小子费了一番小牛鼻子劲,最后终于让他对knitr动心了。我本来做梦也没想到我会跟RStudio真的扯上关系,一年前我写到RStudio的时候只是觉得服务器版本很酷;结果后来Allaire大人亲自登门,一来二去,现在RStudio的开发版本中也纳入了knitr支持,而且俩人作个揖现在互为粉丝了,本小子又忍不住小得意了一番。顺便提一下,现在我的相互粉丝团成员三名,另外两名是咱COS的师姐与小轩哥。好了,尽管吹牛不交税,牛皮吹大了也不好收场,转入严肃话题。

    转台之前,为啥我用“巨子”这个词?显然我最近在看《秦时明月》,我觉得这动画挺好的,寒假在家跟着侄子一起看了几集,第二次觉得国产动画片挺有味道。第一次是看《魁拔》,可惜下一集不知道猴年马月才能出。

    窝窝村,我喜欢这个名字

  3. 得失

    前天江堂来电,说GitHub的事情。我又引一个人上了贼船,不,这不是贼船,是程序员的天堂。简单聊聊美帝生活,发现咱俩都是一山头看另一山头,相互羡慕。我看他生活有声有色,他看我心无旁骛专心折腾代码。文字这东西只是反映生活的一个视角,大部分时间里,可能我们生活也没啥大不一样。说到网站:

    J: 你的网站改版后看起来有品了啊
    X: 其实内部一团糟啊
    J: 人僧追求嘛啊!追求的奏是介个!
    X: 嗯,也是,也是

    我过去好像说过,我追求的就是一个字:美。美网站也好,美代码也好,美味佳肴也好(这个惭愧,追求下降了)。有时候想想,况且况且况况且登场,到底是要追求演一场小戏还是追求成王封侯?子曾经曰过:得之窃喜焉,失之未觉也。(不要搜出处,我是吕秀才的粉丝,大家懂的)

    Youtube上有一则无名视频我觉得很好,它的特别之处在于前后5分钟的内容是一样的,但前5分钟有音乐,后5分钟完全静音。又是一个看事物角度的好例子,于无声处听——呃,不是惊雷——没词了。你听不听得见音乐,在于你心里有没有音乐。

  4. 下回分解

    搬家过后日志的长度明显不一样了,在线写日志和离线用记事本写日志是完全不同的感受。尽管现在倒了些废话出来,还有不少废话。下集预告:归去来兮。

]]>
Jekyll世界 2012-02-12T00:00:00-08:00 谢益辉 http://yihui.name/cn/2012/02/hello-jekyll 一晃三个月过去,这里似乎没了动静。各位大人、路人以及丈人都很好奇,这娃儿究竟干啥去了,于是今天从山沟沟里爬出来解释一下。三个月前我说那是我在WordPress(WP)下写的最后一篇日志,话扔出来了当然不能反悔,尽管中途有几次想写点东西,但都憋回去了。不写日志也好,省点时间写代码。去年10月份中旬我鬼使神差开始写一个叫knitr的新包,其实也是我盘算了几年一直没干的一件事,最后对Sweave终于忍到了极点,操起键盘花了三个月革了命。这是题外话,以后再细说。

每个人离开一个软件或一套系统一般都带着负面情绪,比如烦恼抓狂恨,但WP必然不属于这一类系统;我看到的几乎每一个离开WP投奔Jekyll的人都无一例外大加赞扬WP,这事情就很有趣了,为什么你赞它还要弃用它?我虽然已经换到Jekyll,但也同样赞WP并感恩戴德,过去我已经说过好几次WP是程序设计的上乘之作,它的功能之灵活以及API之清晰别的网站系统很难比拟。然而某些码农的目标只是把事情做完(GTD),某些码农的追求则是无止境的,我就属于极简主义者,理想情况下我希望一套系统只有一个主要功能,把其它枝叶都砍掉,让用户能集中精神只做一件事情。比如博客网站只有写作功能,论坛只有讨论问题功能,聊天软件只有聊天功能。WP基本上符合这个要求了,它和其它的网站系统比,已经大大简化,只要模板设定好,剩下的就是写作;话虽这么说,实际情况却并非如此,我还是要花精力做一些额外的事情,比如我需要上网,要登录后台,要编辑HTML(像我这样的代码洁癖,眼里容不得冗余代码),要管理图片和附件,看着别人的新插件还眼馋(一装就又陷入新的维护陷阱),最要命的是,所有的东西都在数据库中,每次WP出了新版本,我都要颤颤巍巍点那个更新按钮,然后祈祷数据库不要出问题(我懒得导入导出备份)。

Jekyll完全推翻了传统网站的维护方式,它直接回到了“原点”——作者只需要维护文本文件,每一篇日志就是一个文件,程序会根据模板设置自动把这些文本文件翻译为网页。这些文本文件不用HTML,而是用简化版本的Markdown(MD)或者其它可最终翻译为HTML的伪标记语言。MD的哲学深得我心:把语法简化90%,去实现大多数常用的HTML标签,牺牲少数不常用的标签(这些标签仍然可以用原始的HTML代码写)。比如要写无序列表的话,在HTML里面要用

<ul>
  <li>hello</li>
  <li>world</li>
</ul>

每一项列表项都用li标签围起来,而在MD语法里,只需要一行一行写就行了,每一行开头写一个减号 - 就足够,就像自己记笔记一样:

- hello
- world

一个字符(确切地说是两个,后面还得跟个空格)和一串要重复敲的字符比,哪个简洁显而易见。简洁的MD语法配合几项YAML设置就是一篇日志,扔进Liquid模版系统,Jekyll就把网站编译出来了。

八年前我在用文本文件做网站,八年后我又回到了文本文件,当然事情已经有了本质变化。这次从WP搬家,尽管有一些自动转换程序,但还是费了不少劲,423篇中文,103篇英文,几千评论,搬得我差点没疯掉。比如我做的第一件事情是解决上一次搬家的历史遗留问题:从Bo-blog搬到WP的时候,有些评论的嵌套关系乱了,所以我花了一天时间先把评论在数据库中修改对齐,这个过程基本上是手工看评论ID,把父评论和子评论的ID都记下来,然后用R生成几百条SQL语句,扔给数据库执行。评论整完导入Disqus,一个专注于做评论的网站。剩下的日志用一个Python程序从WP的XML文件导出为MD文件,导完又是一片残垣断壁,我只整理了最近的十篇日志,之前的几百篇用R正则表达式简单处理了一下,以后再慢慢手工整理,再往后还想把2004年起的一些老日志也导进来,像王晓伟说的,记录生活。英文简历页面花了很大功夫整理了一下,主要是那些幻灯片文件,整体挪到GitHub中下载,尽管这样会造成一批404错误,但文件太多,重定向太麻烦,想想算了。

凡事如果能退到文本文件的层面,基本上就意味着可以为所欲为了。就如同LaTeX是纯文本文件,所以很方便和R结合生成动态文档;PHP是纯文本文件,可以任意混合HTML代码。如果我乐意,我可以在MD代码里嵌入R代码,动态生成日志(这个实际上已经在knitr中实现了)。

使用Jekyll的另一大动力当然是GitHub,它提供编译服务,所以用户只需要用GIT管理文本文件就可以了。要写日志就新建一个文本文件,写完推上去完事,由于GIT支持离线工作,随时随地都可以写,不受网络环境限制。

为了找一个中意的模板,我把Jekyll维基上的网站列表扒了几遍,最后找到一个符合我理想中的样式的网站,作者也是极简主义者。这个模板适合日志,但不太适合首页,所以我在首页用了另一套模板。中文字体使用肖楠介绍过的冬青黑体和微软雅黑,这样苹果和Windows都能看,而我相信Linux用户对中文字体总是有办法的,比如自己调一下文泉驿字体;英文优先使用Google字体中的Galdeano,然后使用其它常见无衬线字体。整个网页使用了一些HTML5标签,所以关于Windows下的IE浏览器我就不用多说了,若版本不够,页面可能会错乱。

日志页面中支持键盘左右方向键或JK键前后导航,这是JavaScript实现的,归功于Tao Zhang。文章RSS订阅依然存在,所有日志的链接也没有变化,只是评论RSS变了,要么订阅整站评论,要么订阅单篇文章评论(每个页面的底部)。

一连看几年的文章的感触非常大,就像看一部快速播放的电影,生活在其中一天天过没什么感觉,但呼哧一下看过去,感觉很不一样,我从过去自己的一些评论和文章里总结了我的(至少)四点明显问题:

  • 明明年轻却卖老
  • 气盛,欺人
  • 很多评论非常无聊,为了评论而评论
  • 中英混杂

关于这些事,想想有点后背发凉,尤其是第二点,必然伤了一些人;而其中第四点我现如今逮一个批一个,不管是谁(包括师姐在内),不料自己过去其实也是这样的。

]]>
HTML5幻灯片 2011-11-03T00:00:00-07:00 谢益辉 http://yihui.name/cn/2011/11/html5-slides 这大概是我在WordPress下写的最后一篇日志,我要奔向静态网站了。昨天在系里做了个小报告,漫谈一下这几年开发R包的一些故事,基本上是鬼扯。这次的报告摘要是目前写得最成功的一个,因为一点都不严肃,通知发出去之后好几个人遇到我都号称“贼喜欢这摘要”,让我忍不住小得意了一番。由于早已厌倦学术报告上清一色的Beamer片子,我后来投奔古老的Foiltex(基本上就是白纸),这次尝试了一下HTML5,片子做出来我自己都觉得增加了不少讲的动力,因为风格完全自由了,愿意放图就放图,愿意用什么字体就用什么字体,简言之,要多华丽有多华丽。这片子有多难做呢?答案是会打字基本上就够了。我用的是keydown,Ruby Gem一枚,片子的源代码极其简单。

珍爱生命,远离\includegraphics{}

又及:珍爱生命,远离IE。

]]>
魂归大地 2011-10-18T00:00:00-07:00 谢益辉 http://yihui.name/cn/2011/10/back-into-the-dust 标题来自先生的一句话:生不枉来,死不犹豫;立志天下,魂归大地。我似懂非懂。

前些日子,COS内部说起个人网站的事情,我这两天抽空琢磨了一下,猛然间意识到我在折腾网站的八年里走了个循环。昨天我在邮件中描述为“回归尘土”,这事情是这样:九年前开始正式接触电脑,一年后我开始对网站感兴趣,并且找免费个人主页空间找了很久,直到后来有一次在一张传单中看见一个可以免费建站的广告,于是就注册建了一个,当然,那时候不会有什么好货,域名是三级域名,我呆头呆脑抄了很多所谓的英文美文在上面,还从图书馆借了书学HTML,连VBScript都仔细学过,而且对于写个在网页内弹个对话框的小脚本乐此不疲。为了说明这个乐此不疲有多乐此不疲,举一例:在机房上数据库的课,老师会把所有人的屏幕都控制住,而我发现其实只有显示器被控制住了,键盘鼠标仍然可以在“幕后”操作,因此,我按Win + R快捷键,盲打输入notepad,回车,然后开始盲打写弹对话框的VBSript,等到下课,屏幕被解放,我写的脚本真的可以运行并弹对话框。那个免费个人网站也让我学习了一点CSS的概念,但我主要还是用Word的思维方式做网页,哪里要加粗就直接加粗,哪里要变红就选红色,几乎没有“内容与样式分离”的概念(拜Word所赐,可能大多数人到现在也没有这个概念);话说回来,其实我还真用过Word做网页,我的一个亲戚当年让我帮忙做几个网页,我就是手工敲进Word,然后另存为HTML。再过一年,系里网站工作室招学生维护系里的网站,我就呆头呆脑报名去了,就凭我那Word式网站功底。之后接触了Dreamweaver,才算真正掌握HTML,并接触ASP和JavaScript,并且尝试过从零开始建Access数据库连ASP,所以IIS也熟了(估计很多人也不知道什么是IIS,这样也好,祝愿Windows服务器早日垮台)。DW中学会了模板的概念,网页的头尾都用模板定义,这样就省去了重复劳动。因为DW和Fireworks是同一个公司出品,所以编辑图形我都用Fireworks,这也是我在R包忍者篇中说我曾经想学Photoshop的后台故事。从接手系里的网站开始,我开始捣腾论坛系统,此乃灌水元年,也是统计之都的前世。论坛系统换过两次,一直折腾到那台老旧的IBM服务器彻底瘫痪掉。再过一年,博客这个概念开始在中国发芽,第一个博客网大概就是方兴东的博客中国,后已改名为bokee,当时那个玩了两年10磅宋体字的我,看见这个网站有一个12号字的主题,于是立刻注册了个帐号,开始写博客。我对CSS的了解,自此开始深入,比如我曾经发现通过CSS来隐藏网站上的广告的办法——谁让他们支持自定义CSS的呢,我定义一个display:none就把网站上的广告灭了。年少轻狂的这个娃儿,整天给客服提意见,说这不灵活那不好,有一天方兴东接见了一批用户,客服叫了我去,于是我骑着破自行车颠儿颠儿去了,这就是无知者无畏。今天我再搜了一下当年的历史,后知后觉发现本小子也曾经和张纪中、方舟子同时出现过“名人大话博客节”里,现在顿时觉得脸上贴了不少金,哥也曾经风光过。那时候是钱江晚报的记者打电话采访,我都忘了我说了些什么了。在博客中国写了两年,觉得系统越来越差,于是换到blog.com.cn写,它比较容易自定义,当然,对“久经沙场”的我来说,首先就是要用CSS把页面上的广告灭掉。再折腾两年,系统控制越来越严格,尤其是关键词屏蔽,最可恨的是你写一篇文章提交发现不让提交,但就是不告诉你哪个词犯法了,只能一边在心里骂狗日的一边从最后一句话删起,删一句提交一次,看哪次能通过,再一句一句加回来,这就是我早期培养的程序debug方法,极其白痴,极其有效。再后来,换到MSN Space,因为英文字体看起来舒服,所以开始写英文博客(看,从始至终,我都是个视觉驱动的动物,各种转变的原因听起来都非常脑残)。从英文博客开始,我变得极其注重HTML代码的干净(经常切换到代码界面下看看代码是否整齐),或称为HTML代码洁癖,无法容忍没理由的加粗变红或更恶劣的放大字号,这也是我把COS论坛从PHPWind改为bbPress的理由之一:我不能容忍发贴者能放大字号或使用楷体隶书。英文博客写了两年,后来大家都知道了,大中华局域网来了,自此本小子开始建真正的个人网站,注册个人域名,买服务器空间。PHP+MySQL在搭论坛和建个人网站期间也被迫学了点皮毛。后见Wordpress,深感设计之惊艳——无论是PHP程序还是外观,于是COS的主站从MePHP换到WP。无论什么系统,我已经脱离了刀耕火种的纯手工HTML生活。到如今,我在GitHub上写了两年代码后,猛然意识到Markdown这门语言之精炼,这正是我追求的(极度)简洁,而GH对Markdown和其它伪标记语言都支持得非常好,而前两天,又发现基于Markdown的Jekyll,纯文本写博客的系统。除了R语言别的都不会的本小子,意识到我对Ruby、RubyGems和Python的认识已经落后于时代若干年,我以为整个世界还是在PHP+MySQL中运转,结果这些语言已经派生了无数惊人的美观的简洁的静态网站系统。从最初的静态网页,到现在再回归静态网页,我走完一个了循环。回想这些陈年旧事,不免让我再思考乔布斯大人,关于他的报道,我大概就认真看过一两篇,头一次知道他是佛教徒,世人总喜欢盖棺论定,尤其爱总结已成功人士成功的原因,就像经济学家在过去的五次经济危机中成功预测对了二十次一样;我想知道他到底在想什么,他如何追求能降伏用户的细节,或者说如何让产品始终带着人性。统计之都的口号“专业、人本、正直”或许是个好的口号

如果网页可以如此简洁高效并且只是基于纯文本,那么我可以立刻嗅出统计人的一个光明前途。此处省略八千字,如果你手中有八百万风投,请两年后联系我。这里我要说的是魂归大地,但并不是要说我自己,网页和魂归大地扯上关系有点勉强,这些东西真刀实枪干活就行了,没必要整得那么玄乎。最近有两个TED视频,我觉得都非常好,让我想起先生的“魂归大地”。一则为开发新(纳米)材料获取能源(太阳能)的人,技术听起来很诱人,你家的窗户玻璃在夏天自动排热、冬天吸热,不知道能省多少能源,但这不是关键,关键是视频的最后,他从钱包里拿出一张旧报纸上剪下来的照片,那就是那幅著名的获普利策奖的照片《饥饿的苏丹》。“她不应该死于缺水,无论如何”,演讲者说。

另一则为赤脚运动的印度大爷,博士毕业,回村,跟老娘说要先挖井五年(如果我没听错的话),老娘听了差点没气疯。一辈子干了一件事,教育印度农民(或者说被教育),尤其是印度农妇,让五十多岁的老大娘都学会了整太阳能照明;这大爷认为民间自有高手在,要发掘他们的天才才干,向他们学习,他的学校里学生是老师,老师是学生;妇女们都会用太阳光聚焦了做饭,一个个比工程师都厉害;一位妻子说有了太阳能照明,她头一次在冬天里看清了她丈夫的脸。本小子非常相信这位大爷对贫民的看法,穷人有穷人的生存智慧。某个偏远山村的夜里头一次亮起灯光,这种感觉可能就是魂归大地了吧。

]]>
流氓有文化 2011-10-05T00:00:00-07:00 谢益辉 http://yihui.name/cn/2011/10/rascal-with-knowledge 因为Qt的一个错误缓存(严格来说是过度缓存)bug,俺们开发cranvas包也一直很气馁。忍了半年多了,本小子终于不能再忍受,决心使出多年不用的流氓手段插手这件事:挨个找跟这个bug有关的人发邮件问,从各种源代码和邮件列表中找邮箱。找着找着,突然发现这个bug已经在Qt 4.8.0中修正了(未发布),遂停止流氓手段。切,原来我一直被Michael忽悠着,听他的意思好像总在说Qt木有人管了,bug木有修正的可能了。这个bug的大意是如果图中使用了线性缩放的变换,缓存就会失效,任何操作都会导致所有图形元素被重画。对于交互式图形来说,显然没必要重画所有元素,主图层通常是被缓存起来的,只有被选中的元素才被重画,这是提升速度的关键所在。这个问题解决后,即使画三百万个点也只是两三秒的事情,画出来之后刷子可以很流畅地在图上刷,这才能体现Qt真正的威力。

近日看到卢大编辑一万小时PPT的事迹,很赞,我也是相信“死磕到底”的人。想想已经磕了五年统计之都,七年R,九年统计(最后这个数字很有水分,不如前两个数字有底气),但愿不要从学士硕士博士圣斗士磕到烈士。

]]>
纽约Strata及新泽西AT&T之旅 2011-09-27T00:00:00-07:00 谢益辉 http://yihui.name/cn/2011/09/ny-strata-and-nj-att 上周在外面跑了一周,先去了一趟纽约参加O'Reilly组织的Strata会议,接着去新泽西拜访了AT&T实验室,总体来说是一次不错的旅行,不过因为溜达了一周,回来自然又要处理很多事情,这里暂时不详细写行程,只是打个草稿,过一两周我会在统计之都主站上详细介绍Strata。

Strata会议主题为大数据,持续一周五天时间,我只参加了峰会(summit)部分,在它之前有一天热身(jumpstart),之后有两天偏重具体技术性的会议,而中间这两天则相对比较抽象,有些报告我听完感觉就像主席讲话——字字都能听懂,但就是不知道在说什么。峰会自然请的都是大佬,例如英国卫报的编辑,经济学人的编辑,Wolfram的老总,从DC远程视频连线的国会议员,联合国官员,纽约市官员,还有大批公司头目等等。这样一个会议我去了简直是个离群点,很少见学术界人士出现,更不必说学生了;关于此事,有笑话为证——有一个主持人在介绍下一位演讲者的时候讲了个笑话,但是几乎没有人笑,他说:

1010(下一个演讲的公司的名称)你可以认为是ten ten,也可以认为是ten,取决于你用十进制还是二进制。

不知道是太冷了,还是听众都没听懂。

据我有限的笔记和记忆,先简单罗列部分观察:

  • Wolfram是个很有技术范儿的公司(后来我去AT&T进一步证实了这一点),“让知识变得可计算”
  • 联合国官员说,俺们需要您的帮助,大意是想通过更先进更现代的数据处理技术更快掌握信息,如通过Twitter了解饥荒和动乱(动乱还有点谱,饥荒有谱吗?吃不饱饭的人还能上Twitter?)
  • 有法学院教授呼吁提供更多的匿名化处理之后的数据,不要总是把数据藏着掖着
  • GE的人宣称他们就快要公布一大批患者数据了(当然是匿名化处理之后的),对搞数据分析的人来说是个好机会
  • 1010的那个人提出一个利用数据挣钱的模型,但在我看来很傻,大意是老夫有张三的数据,而李四想知道张三的数据且必须通过老夫这儿才能得到,这就是他所谓的Middleman概念(所谓的哲学家都是这样的吗?巨喜欢炒概念,什么“数据之和的价值大于数据的价值之和”)
  • 纽约市的一位负责信息化的官员来讲各种应用数据管理城市的案例,这是我比较喜欢的一场,案例都非常简单有效,比如台风来了哪里的树被吹倒了,市民可以直接在地图上标注并上传事发现场的照片,这样他们就可以调动人员去现场处理,而不必特派专员先去打探情况,再回来调人;在地图上标注也形成了一种间接的投票,要是某个事故举报的人多了,重要性也就排上去了
  • 国会议员讲的东西我完全没能理解,大约是些陈词滥调,什么数据重要啊,应该透明啊,党在努力啊,请人民监督啊……
  • 卫报有专门的数据专栏,有空时不妨一阅,卫报的编辑讲的是数据驱动的新闻业,我在我的《现代统计图形》书中正巧批判了卫报的一幅图
  • 有领导推荐Microstyle一书,说他在DC入职时上司告诉他在DC混的最重要的一点就是这个(说话简洁观点明确)
  • 三四位公司头目讨论新时代的CIO(首席信息官)的角色,其中有Norman Nie,也就是Revolution Analytics的头儿,老爷子似乎各种会议都参加,这次他讲CIO应该懂技术懂算法,果然是统计出身,时刻关心着技术,可是我在想当领导的和当跑堂的都精通端盘子了,谁来管小店的经营呢
  • 有人讲到鸟类觅食的路径,说不是布朗运动,想想也对,通常是一次长的搜索加上若干次短搜索
  • M&M豆跟天气有什么关系?没听清,回头再看看
  • 创建Mineful的是一位统计学PhD,我总是在臆想,一个统计学博士加一个精通网站设计(包括美观设计)和数据库部署的计算机牛人凑在一块肯定是创业的绝配
  • 大家都在讲Hadoop,谈来谈去,总是缺统计分析的味道,我不熟这玩意儿,但Revolution他们似乎在做这方面的工作
  • Google的无人驾驶汽车说:我们不需要什么好算法,我们只需要更多的数据
  • 经济学人杂志的人说,俺们需要一类测量幸福的数据,而不是GDP,我想这也不新鲜啊
  • 要速度,还是得玩内存,号称一秒钟玩一百万行数据的那个人说
  • 第一天晚上在一个很前卫的艺术工厂办酒会和活动,Gelman大人连这样的活动都参加,不得不说他精力充沛,真如其弟子所言,整天到处灌水,给的演讲是去年我请他在我们这儿讲过的,我没听就走了
  • 第二天晚上火花演讲(五分钟演讲)中,有一位相当给力的姐姐痛批当下的SNS工具让人光顾着拍照片而不顾吃饭,分析了去餐馆对着食物拍照并上传到Facebook所消耗的各种能量,结论是这些能量大于食物的能量……
  • 这会议跟我以前参加过的其它会议相比,除了有很强的“高层领导会晤”氛围之外,还有另一大特征,就是无处不见Twitter的身影,每一个演讲者都会自报Twitter帐号,甚至会场还偶尔有Twitter互动
  • 吃饭席间遇到一个麦肯锡的人,于是寻找共同话题,兜了一圈,发现都用R,好嘛,这就好说话了,我问,你知道animation包吗?答曰:知道啊,很好玩噻!接下来还能没话说么……

我去参加会议的主要目的是考虑将这个会议引入中国,这一圈走下来,心里暂时还没有很明确的答案,因为我对国内的商界政界的数据使用情况并不太了解。

切换话题中……开完会第二天去联合国瞅了一眼,到处都是警察,我时间来不及,拍照两张匆匆离开。随后拜见了侯瑀大人,依旧主动,依旧努力,依旧奋发。揖别前往自然历史博物馆,馆内狂奔一圈,然后穿越中央公园,坐公交车沿第五大道从北往南游览一遍(大概跟坐观光车差不多吧),换地铁奔新泽西,始知原来美国也有载人的火车,踏上前往新泽西Summit的火车,因开会时狗屎运抽中小Kindle一枚(美国人傻,把奖券折两折扔桶里,我只折了一折,以提升概率,我看那主持人结结巴巴不知道怎么读名字就知道是我中奖了),火车上遂翻阅《围城》(我承认我落后于时代多年),暗想钱钟书太擅长腹诽,描写的乡巴佬和小气鬼都活灵活现。AT&T隆恩浩荡给我订了宾馆,晚上准备第二天的演讲。

AT&T实验室是个传奇的地方,想想当年贝尔实验室出了多少名垂青史的人,譬如信息论的那个香农,又如统计这边的John Tukey等等。这次去之前我就在想是否有机会见到S语言的三作者(当然Chambers已经不在那儿了),后来果然见到其中一位,Richard Becker,相当激动。上午9点拜见Stephen North,给我介绍一下他们的可视化工作和软件;接下来我准备10点半的演讲,因为老板觉得AT&T都是聪明绝顶的人,担心我这次的演讲不受待见,于是前一周让我在系里演习了一遍,事实证明演习还是有效的,我来美帝之后经常对自己的演讲不满意,尤其是讲完笑话容易后悔觉得自己像个傻瓜,这次自认为讲得还不错,笑话比较应景和自然(我总是把讲笑话放在第一位),例如开场时我看见旁边白板上写着公司内部的无线网用户名和密码,其中密码是 this.getAccess(),我就谎称有点小紧张,因为老板说这里到处都是聪明人,看这板子上的密码都这么极客……

我讲的就是前些天提到的cranvas包,临走前几天,老板可能还是觉得现在的包还不够面子,跟我说如果能把变形地图(cartogram)搞定的话一定能“把AT&T那帮人的袜子打掉”(此乃直译,客官自行查字典:knock the socks off somebody),本小子为了打掉他们的袜子,费了牛鼻子劲把变形地图整出来了,也算是解决了我多年来的一个疑问。

中午吃完饭按照安排一个个拜见,首先就是Becker,B大人说我喜欢你娃儿的报告,然后说变形地图的历史,他在AT&T的可视化方面的工作,如何甄别电话欺诈等等,后来我跟他说08年办第一届中国R语言回忆的时候,我给他发过邮件问那篇S语言历史的文章授权,他当然不记得了,我甚是感叹如今我能当面见到活人,老人家兴致勃勃给我扒出来那些七八十年代的S语言手册,回忆当年的历史(如locator()函数),总之谈话在一片欢乐祥和的气氛中进行。接下来分别拜见Bob(Netflix百万大奖得主之一),Yifan(巨多网络图)和Simon(R core之一,成名作有R的Mac版本和iplots包等)。听了若干有趣的故事,比如如何确定披萨店的电话是顾客从网上的黄页中看见之后打过去的,Augsburg那些学生一人一套可视化图形系统,蝴蝶在整个生态系统中的种类数量占如此大的比例,并且头一次注意到JSS刊物的那幅图中的盘子里是有蚂蚁的(在S的门上看了大图才知道),还有似乎很多美国人都相信蜜蜂要是灭绝了人类就灭绝了……S自己养着一箱蜜蜂,有人问他如何让蜜蜂高兴(前一个话题在谈电子邮件),另外有人插话曰:给它们发邮件!AT&T真的是个很极客的地方,有人从洛杉矶坐飞机到纽约,一路拿着摄像机固定位置拍窗外的云,最后把五个小时的录像的每一帧中部的1像素宽的图截出来并拼成一幅几米长的图,打印了贴在走廊里,由于我在网上找不到这幅图,无法描述这种壮观的“异景”。还有人把电影的每一帧提出来作为一幅小图,按时间顺序拼成一幅大图。话说回来,这些玩意儿有啥用呢?消磨时间?

对了,S提到了R的grid图形系统,说这套系统本来是一套非常理想的图形系统,Murrell就差一步,就差那么一小步,就一小步,就能让R完美支持交互式图形了,可惜他没做。S对此感到非常遗憾。

最后一天回纽约。我总结这纽约的地铁有四处要小心的地方:有时候某些车不开、某些车在某些站不停、有时候这条线会改成那条线、某些站无法不出站而从路的一边换到另一边。对头一次去的人,坐地铁很要命,尤其我这笨头笨脑的,坐在车上总感觉不安,还好最后一路下来没碰到什么大问题。最后一天去大都会博物馆,在里面转了六个多小时,各种雕塑、油画、兵器、乐器、壁画、瓷器、书法等等,看得都快昏死了。有一点很好奇,为什么柬埔寨的佛像无一例外都是面带笑容?

前面说本农民不适应城市,仿佛到处都是坏人,其实一路上都觉得人还挺好的,最后一天在机场还真碰到坏人了,想骗我手机。作为在北京混迹多年的本小子,见过多少骗借手机的,这点小伎俩,对天朝人民是无效的。

回村,处理部分邮件,批完一次作业,补上这篇杂记。退堂!威……武……

鸣谢:Wang Wei,Guo Jiqiang,侯瑀(各种中餐馆子被蹭饭组负责人),Debby Swayne(蹭AT&T饭组负责人),卢大编辑及Michelle(蹭Strata饭组负责人),Hu Yirui(蹭饭未遂组负责人)……

]]>
纽约 2011-09-19T00:00:00-07:00 谢益辉 http://yihui.name/cn/2011/09/new-york 进城越来越不习惯,农村综合症越来越明显。纽约看着就像是另一个国家,上次去迈阿密也像另一个国家。看惯了村夫的老实脸,到了大城市放眼望去仿佛到处都是坏人。纽约到处都是能看的地方,博物馆啊,艺术馆啊,举冰激凌的大姐啊,就是不知道该看哪样。请过路客官推荐个地儿吧。

另:第一天就蹭了两顿饭,只有蹭饭这事儿我从不犹豫。大力感谢Wang W.和Guo J.的招待!

]]>