我是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
答案 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