2017-10-12 112 views
-3
structure(c(-13.2728762809309, 1.4589335335744, 0.484047921906014, 
0.961191008159664, 9.8283305061549, 0.719751064235688, -12.9935586779498, 
1.54850677442014, -13.1416306849761, 1.45529160258359), .Dim = c(2L, 
5L), .Dimnames = list(c("(Intercept)", "PJMPWr[, x]"), NULL)) 

需要使用這些係數進行預測並使用例如C(20,30,40),使得它等於-13.2728 * 20 + 1.4589,-13.2728 * 30 + 1.4589,-13.2728 * 40 1.4589 ..在R中乘以兩個矩陣

+1

這有點不清楚。你的標題是「乘以兩個矩陣」,但你已經列出了一個作爲矢量「c(20,30,40)」。我想你的意圖是把它轉換成一個3x2矩陣(通過添加一列截取的),所以你可以用你的2x5矩陣乘它?此外,您命名爲'(Intercept)'的行不是您在最後給出的公式中用作截距的行 - 是否顛倒了行名? –

+0

yes..eventually得到一個3乘5矩陣,其中每個數字在c(20,30,40)中由PJMPWr多個並添加截取。 – jkl

回答

1

你可以嘗試用mapply如下:

你可以做到這一點
mapply(function(x, y) x[2] * y + x[1], 
     #your coefficients 
     as.data.frame(mat), 
     #your vector replicated 5 times 
     replicate(5, c(20, 30, 40), simplify = FALSE)) 

#   V1  V2  V3  V4  V5 
#[1,] 15.90579 19.70787 24.22335 17.97658 15.96420 
#[2,] 30.49513 29.31978 31.42086 33.46164 30.51712 
#[3,] 45.08447 38.93169 38.61837 48.94671 45.07003 
2

一種方法是這樣的:

(mat <- structure(c(-13.2728762809309, 1.4589335335744, 0.484047921906014, 0.961191008159664, 9.8283305061549, 
        0.719751064235688, -12.9935586779498, 1.54850677442014, -13.1416306849761, 1.45529160258359), 
        .Dim = c(2L, 5L), .Dimnames = list(c("(Intercept)", "PJMPWr[, x]"), NULL))) 
#     [,1]  [,2]  [,3]  [,4]  [,5] 
# (Intercept) -13.272876 0.4840479 9.8283305 -12.993559 -13.141631 
# PJMPWr[, x] 1.458934 0.9611910 0.7197511 1.548507 1.455292 

(vec <- c(20, 30, 40)) 
# [1] 20 30 40 

t(mat[2,] %*% t(vec) + mat[1,]) 
#   [,1]  [,2]  [,3]  [,4]  [,5] 
# [1,] 15.90579 19.70787 24.22335 17.97658 15.96420 
# [2,] 30.49513 29.31978 31.42086 33.46164 30.51712 
# [3,] 45.08447 38.93169 38.61837 48.94671 45.07003 

一些解釋:

  1. 由於mat[1,]mat[2,]是單行,默認行爲是它們被強制爲1維向量。 (參見help(`[`)。)
  2. t(vec)矢量vec轉換爲1 x 3矩陣(參見help(t)。)
  3. 在矩陣乘法mat[2,] %*% t(vec),載體mat[2,]被視爲5 x 1矩陣以使兩個參數順應性的。 (見help(`%*%`)。)因此,乘法的結果是一個5 x 3矩陣。
  4. 將矢量mat[1,]添加到5 x 3矩陣中時,矢量的元素將沿矩陣的列循環。
  5. 最後,將結果轉換爲將其轉換爲所需的3 x 5矩陣。
+0

根據行的名稱,我假設你想讓矩陣的第一行爲截取點,所以你最終得到了'1.4589 * 20 - 13.2728'等等(而不是你的'-13.2728 * 20 + 1.4589')寫)。但是如果我假設錯了,只需交換'mat [1,]'和'mat [2,]' –