我已经编写了以下函数来估计使用所谓的CramérV的多项式变量的成对相关性.我vcd为此目的使用了包,但据我所知,没有现有的函数会从矩阵或data.frame类似的函数创建V的对称相关矩阵cor.
功能是:
require(vcd)
get.V<-function(y){
col.y<-ncol(y)
V<-matrix(ncol=col.y,nrow=col.y)
for(i in 1:col.y){
for(j in 1:col.y){
V[i,j]<-assocstats(table(y[,i],y[,j]))$cramer
}
}
return(V)
}
Run Code Online (Sandbox Code Playgroud)
但是,对于大量变量,它变得相对较慢.
no.var<-5
y<-matrix(ncol=no.var,sample(1:5,100*no.var,TRUE))
get.V(y)
Run Code Online (Sandbox Code Playgroud)
随着您的增加,no.var计算时间可能会爆炸.由于我需要将其应用于data.frame100和更高的长度,我的问题是,是否有可能通过更优雅的编程来"加速"我的功能.谢谢.
我很惊讶我没有在 Win7 下的 Jupyter Notebook 上或在网上找到这个问题的答案。
我只是错误地覆盖了调用块的大部分,但不是全部。自动保存可以追溯到我不想恢复的一些以前的更改。Jupyter Notebook中文本条目的撤消功能在哪里?
我通常如何取包含一致矩阵的两个列表的元素之和?
l1<-list(matrix(1,3,3),matrix(2,3,3))
l2<-list(matrix(3,3,3),matrix(4,3,3))
Run Code Online (Sandbox Code Playgroud)
其中总和定义为:
l3<-list(l1[[1]]+l2[[1]],l1[[2]]+l2[[2]])
Run Code Online (Sandbox Code Playgroud)
和“一般”意味着任何大小的矩阵和任何长度的列表。
为什么这样R呢?
> F & NA
[1] FALSE
> T & NA
[1] NA
Run Code Online (Sandbox Code Playgroud)
我希望代码的第一行也可以进行评估NA.人们告诉我'这只是R'的奇怪行为,但还有其他一些概念吗?
我正在使用一个名为PIMixture(请参阅此处)的旧包,它在代码的各个位置引发了很多错误。它们看起来都像这样或类似(以下几行实际上来自可重现的示例):
> library(PIMixture)
> data(PIdata)
> model<-"C_CIN3PLUS+L_CIN3PLUS+R_CIN3PLUS~RES_HPV16"
> fit1<-PIMixture(p.model=model,data=PIdata1, model="logistic-Weibull")
Error in if (class(mat2) == "numeric") { : the condition has length > 1
Run Code Online (Sandbox Code Playgroud)
经过调查我发现
> class(mat2)
[1] "matrix" "array"
Run Code Online (Sandbox Code Playgroud)
因此 if 子句返回错误。我不敢相信这是开发包时的一个问题,因为它会被注意到。因此我想知道在 R 的早期版本中是否class(mat2)可能评估为"Matrix"only,因此长度为 1。我可以在源代码中应用修复,PIMixture如下所示:class(mat2)[1]。不太好,但是这个包就可以工作了。我想知道这个问题是否是由于 R 跨版本的更改而发生的,或者为什么会发生这个问题。
我是python的新手,使用进行绘图时有些困难pyplot。我的目标是%pylab inline在Juypter Notebook中在线绘制图的网格()。
我编写了一个函数plot_CV,该函数在一些x的多项式的阶上绘制交叉验证erorr,而在整个图中,惩罚程度(lambda)应当变化。最终在lambda中有10个元素,它们由中的第一个参数控制plot_CV。所以
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
ax1 = plot_CV(1,CV_ve=CV_ve)
Run Code Online (Sandbox Code Playgroud)
给
现在,我想我必须add_subplot像在
fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)
ax1 = plot_CV(1,CV_ve=CV_ve)
ax2 = fig.add_subplot(2,2,2)
ax2 = plot_CV(2,CV_ve=CV_ve)
ax3 = fig.add_subplot(2,2,3)
ax3 = plot_CV(3,CV_ve=CV_ve)
ax4 = fig.add_subplot(2,2,4)
ax4 = plot_CV(4,CV_ve=CV_ve)
plt.show()
Run Code Online (Sandbox Code Playgroud)
但是,如果我继续这样做,则图将变得越来越小,并开始在x和y标签上重叠。这是一张3 x 3的图片。
有没有一种方法可以均匀分布图,以使其不重叠并更好地利用Jupyter Notebook中的水平和垂直在线空间?为了说明这一点,这里提供了jupyter的屏幕截图:
最后说明:我仍然需要添加标题或注释,其中包含当前使用的lambda级别plot_CV。
编辑:使用建议的紧密布局,给出:
编辑2:使用fig.set_figheight和fig.set_figwidth我最终可以使用可用的全长和高度。
我想在一个data.frame与所做的相似的交叉因子水平上应用一个函数aggregate,但是对于比aggregate可以处理的更复杂的函数.
例如.
fact1=c(rep('A',6),rep('B',6))
fact2=c(rep(c(rep('C',3),rep('D',3)),2))
crit1=rnorm(12)
crit2=crit1+rnorm(12)
dat=data.frame(fact1,fact2,crit1,crit2)
target.fit = function(dat){
mod=lm(dat$crit2~dat$crit1)
return(mod$coefficients[2])
}
Run Code Online (Sandbox Code Playgroud)
此代码生成一个data.frame dat.目标是适用target.fit于每个交叉级别fact1和fact2(此处为lm).
对于仅需要一个输入向量的函数(例如均值使用),这很简单aggregate.
> aggregate(dat,list(fact1=fact1,fact2=fact2),mean)
fact1 fact2 fact1 fact2 crit1 crit2
1 A C NA NA -0.5875951 -0.6048572
2 B C NA NA 0.3712372 0.9135742
3 A D NA NA -1.0163750 -2.4971846
4 B D NA NA 0.3937682 0.6227697
Run Code Online (Sandbox Code Playgroud)
但是,aggregate对于多变量输入不起作用.
> aggregate(dat,list(fact1=fact1,fact2=fact2),target.fit)
Error in dat$crit2 : $ …Run Code Online (Sandbox Code Playgroud) r ×5
matrix ×3
aggregate ×1
apply ×1
arrays ×1
correlation ×1
list ×1
matplotlib ×1
na ×1
performance ×1
plot ×1
python ×1
version ×1