【问题标题】:R error incorrect number of subscripts on matrixR错误矩阵上的下标数量不正确
【发布时间】:2017-02-20 04:06:11
【问题描述】:

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

我稍微查了一下这个错误,并认为它可能没有将 fit$residuals 识别为向量,所以我尝试指定它(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

【问题讨论】:

  • 我能问一下为什么我的问题被否决了吗?
  • residuals 来自哪里?你真的希望它是二维的吗?
  • 你可以,但只有反对者才能回答。但是,我可以告诉您,如果您也提供数据,我(和其他人)会更愿意提供帮助。见这里:stackoverflow.com/questions/5963269/…
  • 我不确定我是否理解您的问题。你的意思是“残差[i,]
  • 我发布了我的数据格式。抱歉,我只是没有看到这有什么帮助

标签: r matrix


【解决方案1】:

您需要预先分配输出向量。但是,使用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

【讨论】:

    猜你喜欢
    • 2021-01-05
    • 1970-01-01
    • 2016-04-27
    • 2016-10-11
    • 2020-03-05
    • 2020-03-04
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多