2015-03-31 51 views
1

从开始:如何向量化的代码中的R

m <- matrix(c(12,9,8,31), nrow=2) 
(m.obs <- m.exp <- addmargins(m, FUN=sum, quiet=T)) 

我有以下代码:

m.exp[1,1] <- m.obs[1,3]/m.obs[3,3] * m.obs[3,1] 
m.exp[1,2] <- m.obs[1,3]/m.obs[3,3] * m.obs[3,2] 
m.exp[2,1] <- m.obs[2,3]/m.obs[3,3] * m.obs[3,1] 
m.exp[2,2] <- m.obs[2,3]/m.obs[3,3] * m.obs[3,2] 

这可以写成一个嵌套循环如下:

for (row in 1:2) { 
    for (column in 1:2) { 
    m.exp[row,column] <- m.obs[row,3]/m.obs[3,3] * m.obs[3,column] 
    } 
} 

我的问题是这是否也可以写成矢量化的形式。有人甚至可以通过不同的方式来实现这个代码的矢量化吗?或者还有其他的方法可以简化它吗?

我的目标是找到不同的可能性,说明如何在R中更快和/或更优雅地编写代码。这个想法当然是要有比这个玩具例子大得多的矩阵。

这个例子的背景是根据chi-squared test的观察频率计算预期频率的矩阵。

+2

请为'm.exp'和'm.obs'提供示例值(例如,使用'dput'避免循环)。 – 2015-03-31 12:58:44

+0

@JoshuaUlrich:完成 – vonjd 2015-03-31 13:00:45

+0

@JoshuaUlrich:我也加了一些背景信息 – vonjd 2015-03-31 13:11:06

回答

2

试试这个

(m.obs[-3, 3]/ m.obs[3,3]) %*% t(m.obs[3, -3]) 
+0

+1,你能给一些解释你怎么到达那里?是否涉及一些一般原则?谢谢! – vonjd 2015-03-31 16:16:43

+1

它正在将问题转化为矩阵代数。我很高兴我的帮助。 – 2015-04-01 07:02:23

1

您可以通过编写它作为

m.exp[1:2, 1:2] <- m.obs[rep(1:2, 2), 3] * 
    m.obs[3, rep(1:2, each = 2)]/m.obs[3,3]