如何在 R 中向量化此代码
How to vectorize this code in 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 中使代码更快 and/or 更优雅。这个想法当然是拥有比这个玩具示例大得多的矩阵。
此示例的背景是根据 chi-squared test 的观测频率计算预期频率矩阵。
你可以把它写成
来避免循环
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]
试试这个
(m.obs[-3, 3]/ m.obs[3,3]) %*% t(m.obs[3, -3])
开始于:
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 中使代码更快 and/or 更优雅。这个想法当然是拥有比这个玩具示例大得多的矩阵。
此示例的背景是根据 chi-squared test 的观测频率计算预期频率矩阵。
你可以把它写成
来避免循环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]
试试这个
(m.obs[-3, 3]/ m.obs[3,3]) %*% t(m.obs[3, -3])