Categories
日常应用

R的outreg:输出回归结果表格via stargazer

大概被这个问题折磨的最多的人就是搞econometrics的人吧...熟悉stata的人应该都很喜欢outreg这个功能,而R里面就麻烦得多。以前一直写一个outreg()的函数来搞定这件事儿,现在看来有更方便的方法了——stargazer这个包。什么AER、QJE之类的完全不在话下。

stargazer_regression

这个包支持这些对象:

lm, glm, svyglm, plm, betareg, gee, gam, polr, survreg , coxph, tobit (AER), ivreg (AER), zeroinfl (pscl), hurdle (pscl), multinom (nnet), as well as their implementations in Zelig

还支持这些期刊的表格格式:

American Economic Review, in the Quarterly Journal of Economics, or in Administrative Science Quarterly. Political scientists can avail themselves of templates based on the American Political Science Review, the American Journal of Political Science, and on International Organization. For sociologists and demographers, the American Sociological Review, the American Sociological Reviews and Demography are available.

该收收了吧,哈哈。

Categories
读书有感

统计学习精要(The Elements of Statistical Learning)课堂笔记(二十五):降维和PCA

 降维

降维完全属于unsupervised learning了,即给定数据集,我们希望降到q维的。从这个角度来讲,降维和聚类还是有相通之处的,都是对于特征的提取。只是一个从行的角度出发,一个对列操作的感觉。

PCA(主成分分析,Principle Component Analysis)

个人觉得这也是起名字起的比较好的模型之一...乍一听起来很有用的感觉 -_-||

1. 求,使得,且最大。

PCA

直觉上来讲,就是想寻找一个主方向。

这样,求解问题为:

。所以我们只需要求一阶导数即可。

设A为对称矩阵,则存在正交阵使得,其中为A的特征值矩阵,故(列向量为特征向量)。不失一般性,我们可以排序使得(从大到小排序)。

最大特征值:

同时为x的相关矩阵,,从而

2. 找到(q维的子空间)

投影到该q维空间,这样,且最小。

A矩阵的范数:
tr表示矩阵的迹(对角线元素和)。

则上述问题等价于,求使得最小。

最小。

即使得最大(注意没有负号)。

称为数据的相似矩阵

均为对称阵,且两个阵有相同的特征值。记为A的秩,AA'的特征向量,A'A的特征向量,则。做奇异值分解,则.

由此,求得的和前述结果等价。

回到PCA。如果降维后需要重构,则,解即可。

3. 对偶PCA。如果即数据非常高的时候,可以转置后再做。

4. KPCA (kernel)PCA也可以先用核函数,即实现非线性的降维。需要注意,降维的过程需要保持可逆。

---------------

PS. PCA不适合解决overfitting的问题。如果需要解决,加regularization项。

Categories
读书有感

统计学习精要(The Elements of Statistical Learning)课堂笔记(二十二):核函数和核方法

补上笔记。这节课讲的就是大名鼎鼎的Kernel Method...

核函数(正定)

定义 , 满足:

1) 对称:

2) 正定: n个观测 正定(或者非负定)。

举例:

  • 常数——
  • 内积—— ,或广义下,其中,从

性质:

1. 封闭性

1) 正定,,则正定。

2) 正定,正定,则正定,正定。

3) 正定,,则正定。

4) 正定

5) 正定。

2. 归一性

正定,

再生核Hilbert空间(RKHS)

(走神一下:关于这个命名的吐槽猛击 -> 翻译版、 英文原版Normal Deviate

1. Hilbert空间:完备内积空间,可以视作欧氏空间的推广。

在这个空间中,我们定义:

  • 加法:x+y
  • 数乘:,
  • 内积:对称性;线性 .
  • 零元素:若,则定义为零元素。
  • 完备性:如果,则。(收敛到该空间内)。

2. 再生核Hilbert空间

给定正定,可以构造Hilbert空间H使得;且构造一个,使得,即核函数可以写成内积形式。

这样对于

核方法

1. 基本思想

将线性模型推广到非线性模型的方法(其中较为简单的一种)

,从的一个映射。举例:,这样就可以拓展为广义线性模型。

2. SVM

可以转化为:

,则

非线性变换之后,

注意此时的维数有变化()。

---------------------

如果各位更关心SVM后面的直觉,还是去看看Andrew Ng的相关课程吧...这里推导太多,直觉反而丢了一些。

Categories
日常应用

从R里面底层操纵Excel/xlsx(自动化报告福音)

好吧,我在eBay折腾的最多的就是生成自动化报告时候各种软件之间的相互调用,什么R啊,SAS啊,Teradata啊,Excel啊,Python啊,反正基本都有机会相互调用一下。每到此时我就深深感慨选择一个library丰富的工具是多么的重要!You could hardly expect what you colleagues are handy with!(P.s. 不要跟我提VBA这种逆天存在的东西。有哪个时间研究它你学点啥别的不好...)

今天忍无可忍+心情大好的折腾了一下R和excel。这个不是简单的从R里面读写excel数据,而是真心用R去操纵excel里面的单元格(cell),除了读写数据之外还要定义样式什么的。excel作为一个奇葩的软件,you may never expect where people would paste data to! 然后他们再自定义一堆样式(我恨这种点点鼠标就能改的东西,你丫又不是Photoshop...)。

但是没办法,人家定义好的“高端洋气”的报表姿态你不能轻易动啊。只能乖乖的往里面paste数据。这件事虽说一次两次手动也就罢了,三五次真的是要疯掉的。anyway,万事总有解决的途径...

很久以前从Yixuan 的博客上得知有xlsx这么个包,当时只记得这东西可以读写xlsx...直到后面折腾了一下才知道这货底层居然调用的是java的xlsx API,也就是说不用写Java也可以操作xlsx了,yeah!

为了生成excel格式的自动化报告(不要问我为啥不用knitr,不用***,说起来都是泪呀!),我主要需要解决的就是:

  • 读取原有xlsx文件,保持格式、附加新格式。
  • 在相应的位置粘进去新的数据。(当然如果只有这么一个需求可以通过ODBC来做...)

第一个倒是满简单的,就是较之yixuan代码里面的createWorkbook(),改成loadWorkbook()就可以了。然后就是找到相应的sheet,这个也满简单的,一行getSheets搞定。

然后第二步建议不要去操作cell(太没效率了),直接操作cellblock。CellBlock()可以用来定义一个新的CellBlock,然后灵活运用CB.setBorder()和CB.setColData()就可以先增加边框、然后一列列填充数据。这里使用按列填充数据主要是因为R里面的Data Frame是一列一个数据格式的,一下子把一块儿都paste到excel的cellblock里面的话,会报错...BTW为了定义边框的样式,需要用到Border()。类似的还可以定义Fill和Font这些。

同上,最好不要直接用addDataFrame()来直接贴数据...格式不能覆盖。如果是要在一个新的sheet上贴数据,那么就write.xlsx(sheetName="newsheet",append=T)好了。不需要通过上述底层的API折腾了。

最后还有一个比较有用的函数,autoSizeColumn()可以用来自动调整列宽。全鼓捣完之后saveWorkbook()保存就可以啦。

最后的最后,一个珍贵的建议——都在R里面把数据整理好再去想输出到excel里面(什么reshape2啊,data.table啊,plyr啊,该上的一起上啊!),千万别手贱在excel里面改一点点小东西...每一次都手动改一下下你的时间就被白白浪费了好几分钟!珍爱生命,远离excel...

附上一段我最后搞定自动化报告的代码:

library("xlsx")
test_template <- loadWorkbook("template.xlsx") #读入template.xlsx文件。定义好各种乱七八糟的格式的。
design_tab <- getSheets(test_template)[["design"]] #转到design这个sheet。
data_block <- CellBlock(design_tab, 5,5,nrow(mydata),ncol(mydata)) #准备贴数据的方块,我这里从第5行第5列开始贴。
border <-  Border(color="black", position=c("LEFT", "RIGHT"),
pen=c("BORDER_THIN", "BORDER_THIN")) #定义边框样式——左右黑色细直线。
for (i in 1:ncol(mydata))
{
CB.setBorder(data_block, border,colIndex = i,rowIndex=1:nrow(onetime_design_tab)) #给每一列都贴上边框
CB.setColData(data_block, mydata[,i], i, rowOffset=0, showNA=F, colStyle=NULL)#给每一列贴数据
}
border_bottom <-  Border(color="black", position=c("LEFT", "RIGHT","BOTTOM"),pen="BORDER_THIN") #定义结尾行样式——底端黑细直线
data_block_bottom <- CellBlock(design_tab, 5+nrow(mydata),5,1,ncol(mydata)) #选择最后一行
CB.setBorder( data_block_bottom, border_bottom, 1, 1:ncol(onetime_design_tab)) #定义最后一行格式
autoSizeColumn(design_tab, 5:(5+ncol(onetime_design_tab)))#调整列宽
saveWorkbook(test_template, file=output_xlsx_name) #保存
##add row data
write.xlsx(rawdata, file=output_xlsx_name, sheetName="raw_data",append=T,row.names=F) #直接贴原始数据,无格式
###add queries
R_file <- readLines(R_file_name, n=-1) #直接贴R代码
SQL_file <- readLines(SQL_file_name, n=-1)
write.xlsx(SQL_file, file=output_xlsx_name, sheetName="query_SQL",append=T,row.names=F) #直接贴代码到新的sheet中
write.xlsx(R_file, file=output_xlsx_name, sheetName="query_R",append=T,row.names=F)

 


Categories
游来游去

长安一片月,万户捣衣声——西安速记

不知道为什么,每次西安都是来去匆匆。没有呆过超过三天的。于是乎,对于这座我最喜欢的北方城市,印象总是断断续续的,一丝一缕的。

DSC07959-r
长安万户

一直在想,我可能再也不会经历早起赶飞机、暮迟宿夜车这样的旅行了,毕竟已经年老体衰、精神不比当年了。然而主观臆断就是用来被打破的。几句电话、几往短信,然后我就背着背包出现在了大雨滂沱的古城西安(小轩哥霸气~~~一硕下了班就直接来了,随性至此,V5~~~)。那天的雨着实太大(两朵乌云着实不能出现在同一座城市),一切的记忆都是湿漉漉的。那种酣畅淋漓的大雨,正是北方下雨的记忆——或许慢慢习惯了南方的阴雨绵绵,这样久违的畅快一下子勾起了北方的亲切。

“少小离家老大回,乡音未改鬓毛衰。”

南方实在是缺乏一点气势。总是柔柔的,柔柔的。时间久了,就觉得整个人都靡软了,缺乏奋斗的力气了。然而原本,尚年少,可疯狂。

长安是一座有脾气的城市。火车站正对着的城墙,相比于苏州火车站正对着的园林,气势上远远压过。一下子,就不知道自己身处的年代——为什么岁月可以这样变化,穿越古今?骑行在宽阔的城墙上,正如丞相当年那般气宇轩昂——两侧的车水马龙凡人喧嚣,与我何干?沏一壶清茶,落座于伞下。携三五好友,谈天论地,好不畅快!

DSC07933-r
冲天香阵透长安,满城尽带黄金甲。

DSC08070-r
长安陌上无穷树,唯有垂杨管别离。

金戈铁马,唤起的是对于远古的铁血记忆。许多奇迹,长埋地底。

DSC07881-r
秋风吹渭水,落叶满长安。

偶尔,月夜朦胧,恍若江南。停辙,起伞,落座。

DSC07868-r
长相思,在长安

DSC07846-r
曲江烟雨

回程之前,随意漫步。东北角楼,斜阳无数。偶逢高人,少聊摄影。略略指点,方知陕西之博大,意欲驾车重游。

DSC08083-r
古城落日

来长安,只要吃到皮脆里嫩的肉夹馍,以及酸酸辣辣的凉皮,人生就满足了。太解馋了。(战绩:5.5个肉夹馍,吼吼)

DSC08000-e
一只边走边吃的吃货的幸福

DSC07986-r
曲径求“道”

长安漫游路线图:钟楼/鼓楼(有定时钟鼓表演) -> 曲江池遗迹 -> 兵马俑/秦始皇陵 -> 城墙(骑行,南门有定时士兵表演) -> 书院门漫步 -> 东北角楼落日。下面是随手拍的照片,随便看看,权作回忆。