R错误矩阵上的下标数不正确

时间:2016-10-11 14:55:35

标签: r matrix

我是R的初学者。我有两个矩阵,行数相同(比方说10个),还有很多列。我想在matrixA的eacg行和matrixB的相应行之间使用glm进行线性回归。我想在一个新矩阵中打印残差,这个矩阵与原始矩阵的行数相同:

matrixA <- read.table("fileA.txt", header=TRUE, row.names=1)
matrixB <- read.table("fileB.txt", header=TRUE, row.names=1)

for(i in 1:10) {
    response = as.matrix(matrixA)[i,]
    predictor = as.matrix(matrixB)[i,]
    fit <- glm(response ~ predictor)
    residuals[i,] <- fit$residuals
}

但是,我收到此错误:

Error in residuals[1, ] <- fit$residuals : 
  incorrect number of subscripts on matrix

我稍微查了一下这个错误,并认为它可能无法识别拟合$残差作为向量,所以我试图指定它(as.vector(fit $ residuals)),但这并没有解决它。

我对如何解决此问题有任何想法?谢谢!

矩阵的格式(两者都具有相同的格式)

    a   b   c   d   f
A   1.0 2.0 3.0 4.0 5.0
B       …
C
D
E
F
G
H
I
J

1 个答案:

答案 0 :(得分:3)

您需要预先分配输出向量。但是,使用mapply更容易/更清洁。如果你传递两个向量(包括列表),它会同时迭代两个向量并将函数应用于配对元素。因此,我们只需要将矩阵拆分成列表。

A <- matrix(1:9, 3)
B <- A * 3 + 2 + 1/A

t(mapply(function(a, b) {
  fit <- lm(b ~ a)
  residuals(fit)
}, split(A, letters[1:3]), split(B, letters[1:3])))
#           1           2          3
#a 0.10714286 -0.21428571 0.10714286
#b 0.03750000 -0.07500000 0.03750000
#c 0.01851852 -0.03703704 0.01851852

residuals(lm(B[1,] ~ A[1,]))
#        1          2          3 
#0.1071429 -0.2142857  0.1071429 

这是一个for循环,它执行相同的操作:

result <- matrix(NA, nrow = nrow(A), ncol = ncol(A))
for (i in seq_len(nrow(A))) {
  result[i,] <- residuals(lm(B[i,] ~ A[i,]))
}
#           [,1]        [,2]       [,3]
#[1,] 0.10714286 -0.21428571 0.10714286
#[2,] 0.03750000 -0.07500000 0.03750000
#[3,] 0.01851852 -0.03703704 0.01851852