首页 > 解决方案 > 如何在 R 中的矩阵中进行外推和内插?

问题描述

假设我有以下矩阵(示例):

mat <- matrix(rnorm(30,0,1),3,10) 

colnames(mat) <- c(0.5,1:9) 

然后我想推断 0 然后在值之间进行插值。最后,我想要一个带有外插值和插值的矩阵:

solution_mat <- matrix(rnorm(273,0,1),3,length(seq(0,9,0.1)))

colnames(solution_mat) <- c(seq(0,9,0.1))

我怎样才能做到这一点?有解决这个问题的包吗?谢谢!

标签: r

解决方案


我假设你的意思是线性插值。您可以使用approx它来执行此操作,如果它在一个内部,apply您可以一次对整个矩阵执行此操作。

但是,您需要先在左侧手动外推回零:

# Create data
set.seed(69)
mat <- matrix(rnorm(30,0,1),3,10) 
colnames(mat) <- c(0.5,1:9) 

# Linear extrapolation back to 0 on left
col_vals <- as.numeric(colnames(mat))
mat <- cbind(1/(col_vals[2] - col_vals[1]) * mat[,1] - mat[,2], mat)
colnames(mat)[1] <- "0"

插值部分很简单:

# Use approx inside apply to interpolate matrix row-wise
new_x <- seq(0, 9, 0.1)
mat <- t(apply(mat, 1, function(x) approx(as.numeric(colnames(mat)), x, new_x)$y))
colnames(mat) <- new_x

并产生以下结果:

mat
#>              0        0.1       0.2        0.3        0.4         0.5
#> [1,]  1.104220  0.8988088  0.693398  0.4879871  0.2825762  0.07716537
#> [2,]  1.688841  1.4259361  1.163031  0.9001258  0.6372207  0.37431557
#> [3,] -1.859251 -1.5543635 -1.249476 -0.9445887 -0.6397013 -0.33481390
#>             0.6        0.7        0.8        0.9          1        1.1
#> [1,] -0.1282455 -0.3336564 -0.5390672 -0.7444781 -0.9498890 -0.7104907
#> [2,]  0.1114104 -0.1514947 -0.4143998 -0.6773050 -0.9402101 -0.9365837
#> [3,] -0.0299265  0.2749609  0.5798483  0.8847357  1.1896231  0.9539753
#>             1.2        1.3          1.4         1.5        1.6        1.7
#> [1,] -0.4710925 -0.2316942  0.007704017  0.24710226  0.4865005  0.7258988
#> [2,] -0.9329574 -0.9293311 -0.925704743 -0.92207841 -0.9184521 -0.9148257
#> [3,]  0.7183274  0.4826796  0.247031707  0.01138385 -0.2242640 -0.4599118
#>             1.8        1.9          2        2.1        2.2        2.3
#> [1,]  0.9652970  1.2046953  1.4440935  1.1425768  0.8410601  0.5395435
#> [2,] -0.9111994 -0.9075731 -0.9039467 -0.8304697 -0.7569927 -0.6835157
#> [3,] -0.6955597 -0.9312076 -1.1668554 -1.0149945 -0.8631337 -0.7112728
#>             2.4         2.5        2.6        2.7        2.8        2.9
#> [1,]  0.2380268 -0.06348991 -0.3650066 -0.6665233 -0.9680400 -1.2695566
#> [2,] -0.6100386 -0.53656160 -0.4630846 -0.3896075 -0.3161305 -0.2426535
#> [3,] -0.5594119 -0.40755103 -0.2556902 -0.1038293  0.0480316  0.1998925
#>               3        3.1         3.2          3.3         3.4        3.5
#> [1,] -1.5710733 -1.5194710 -1.46786868 -1.416266357 -1.36466404 -1.3130617
#> [2,] -0.1691765 -0.1107594 -0.05234237  0.006074673  0.06449172  0.1229088
#> [3,]  0.3517533  0.1854406  0.01912780 -0.147184977 -0.31349775 -0.4798105
#>             3.6        3.7        3.8       3.9         4        4.1        4.2
#> [1,] -1.2614594 -1.2098571 -1.1582548 -1.106652 -1.055050 -0.9045474 -0.7540448
#> [2,]  0.1813258  0.2397429  0.2981599  0.356577  0.414994  0.3135009  0.2120078
#> [3,] -0.6461233 -0.8124361 -0.9787488 -1.145062 -1.311374 -1.2199133 -1.1284522
#>             4.3          4.4         4.5        4.6          4.7        4.8
#> [1,] -0.6035421 -0.453039412 -0.30253674 -0.1520341 -0.001531381  0.1489713
#> [2,]  0.1105147  0.009021623 -0.09247147 -0.1939646 -0.295457662 -0.3969508
#> [3,] -1.0369911 -0.945529994 -0.85406889 -0.7626078 -0.671146692 -0.5796856
#>             4.9          5        5.1        5.2        5.3        5.4
#> [1,]  0.2994740  0.4499766  0.4531326  0.4562886  0.4594446  0.4626006
#> [2,] -0.4984439 -0.5999369 -0.5657667 -0.5315964 -0.4974262 -0.4632559
#> [3,] -0.4882245 -0.3967634 -0.1076970  0.1813694  0.4704358  0.7595022
#>             5.5        5.6        5.7        5.8        5.9          6
#> [1,]  0.4657566  0.4689126  0.4720686  0.4752246  0.4783806  0.4815365
#> [2,] -0.4290857 -0.3949154 -0.3607452 -0.3265749 -0.2924047 -0.2582344
#> [3,]  1.0485686  1.3376350  1.6267014  1.9157678  2.2048341  2.4939005
#>             6.1        6.2        6.3        6.4        6.5        6.6
#> [1,]  0.4287452  0.3759539  0.3231625  0.2703712  0.2175798  0.1647885
#> [2,] -0.3102029 -0.3621714 -0.4141399 -0.4661083 -0.5180768 -0.5700453
#> [3,]  2.1147251  1.7355496  1.3563742  0.9771988  0.5980233  0.2188479
#>             6.7         6.8          6.9           7         7.1         7.2
#> [1,]  0.1119972  0.05920581  0.006414474 -0.04637687 -0.06518106 -0.08398526
#> [2,] -0.6220138 -0.67398223 -0.725950706 -0.77791918 -0.69769126 -0.61746334
#> [3,] -0.1603276 -0.53950303 -0.918678478 -1.29785392 -1.09924062 -0.90062731
#>             7.3        7.4        7.5        7.6         7.7        7.8
#> [1,] -0.1027895 -0.1215936 -0.1403978 -0.1592020 -0.17800623 -0.1968104
#> [2,] -0.5372354 -0.4570075 -0.3767796 -0.2965517 -0.21632375 -0.1360958
#> [3,] -0.7020140 -0.5034007 -0.3047874 -0.1061741  0.09243923  0.2910525
#>              7.9           8         8.1        8.2        8.3        8.4
#> [1,] -0.21561462 -0.23441882 -0.05623973  0.1219394  0.3001185  0.4782975
#> [2,] -0.05586791  0.02436001 -0.08363285 -0.1916257 -0.2996186 -0.4076114
#> [3,]  0.48966585  0.68827916  0.69400178  0.6997244  0.7054470  0.7111696
#>             8.5        8.6        8.7        8.8        8.9          9
#> [1,]  0.6564766  0.8346557  1.0128348  1.1910139  1.3691930  1.5473721
#> [2,] -0.5156043 -0.6235972 -0.7315900 -0.8395829 -0.9475757 -1.0555686
#> [3,]  0.7168923  0.7226149  0.7283375  0.7340601  0.7397827  0.7455053

reprex 包(v0.3.0)于 2020-06-27 创建


推荐阅读