2016-10-11 347 views
0

私はRの初心者です。私は同じ数の行を持つ2つの行列を持っています。私は行列Aのeacg行と行列Bの対応する行との間にglmを使って線形回帰をしたい。私は、元の行列と同じ行数を持つであろう、新しい行列で残差を印刷したい:Rエラー行列の添え字の数が正しくありません

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

は私が求めることができますか? – arielle

+0

「残差」はどこから来たのですか?あなたは本当にそれが2次元になりたいですか? –

+1

可能ですが、ダウン・ボッターだけが答えることができます。しかし、データを提供した場合、私(そして他の人たち)がもっと喜んで助けてくれると言います。こちらをご覧ください:http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – snoram

答えて

3

。ただし、mapplyを使用する方が簡単です。 2つのベクトル(リストを含む)を渡すと、両方を同時に反復し、ペアになった要素に関数を適用します。したがって、行列をリストに分割するだけで済みます。ここで

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ループがある:私の質問は、downvotedされている理由

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 
+0

ありがとうございました! – arielle

関連する問題