系列相关系数计算

时间:2018-03-31 12:51:40

标签: r correlation

我想分析R中的默认数据集(mtcars数据集)。我有兴趣根据以下规则创建相关系数列。仅在“mpg”和“wt”之间的前三个观测值((即,行1,2,3))的相关系数,然后离开第一行,再次计算下三个观测值之间的相关系数(即,第2,3行, 4)在mpg和wt之间然后离开前两行,再次计算mpg和wt之间的下三个观察值(即,行3,4,5)之间的相关系数,依此类推直到结束。例如

cor(mtcars$mpg[c(1,2,3)],mtcars$wt[c(1,2,3)])
cor(mtcars$mpg[c(2,3,4)],mtcars$wt[c(2,3,4)])
cor(mtcars$mpg[c(3,4,5)],mtcars$wt[c(3,4,5)]);

等等。 任何人都可以帮助如何使用循环等自动化这个R代码。

Example,看看我是如何需要输出的,我已经在excel中完成了但我需要在R中完成。

2 个答案:

答案 0 :(得分:1)

cor(mtcars$mpg[c(1,2,3)],mtcars$wt[c(1,2,3)])的值是-0.8884586;但是,问题中输出图像的“关联”列中的第一个值不是这样,因此相对于所需内容的描述,所显示的图像中存在一些错误。我们假设描述是正确的,样本输出不是。

尝试滚动申请rollapply。它将函数cor2应用于宽度为3的滚动窗口。align = "left"表示它使用当前行和接下来的2行,以便NA值出现在问题中的图像中。 fill = NA使它为最后2个元素生成NA值,因为这些元素不再有3个元素。

library(zoo)

mtcars2 <- mtcars[c("mpg", "wt")]
cor2 <- function(x) cor(x[, 1], x[, 2])
transform(mtcars2, cor = rollapply(mtcars2, 3, cor2, by.column = FALSE,  
   align = "left", fill = NA))

,并提供:

                     mpg    wt         cor
Mazda RX4           21.0 2.620 -0.88845855
Mazda RX4 Wag       21.0 2.875 -0.82589964
Datsun 710          22.8 2.320 -0.87097656
Hornet 4 Drive      21.4 3.215 -0.99520846
Hornet Sportabout   18.7 3.440 -0.99985063
Valiant             18.1 3.460 -0.99534538
Duster 360          14.3 3.570 -0.97267882
Merc 240D           24.4 3.190 -0.90784130
Merc 230            22.8 3.150 -0.96247218
Merc 280            19.2 3.440 -0.86602540
Merc 280C           17.8 3.440 -0.99308187
Merc 450SE          16.4 4.070 -0.05428913
Merc 450SL          17.3 3.730 -0.96311366
Merc 450SLC         15.2 3.780 -0.99534934
Cadillac Fleetwood  10.4 5.250  0.05301502
Lincoln Continental 10.4 5.424 -0.98658763
Chrysler Imperial   14.7 5.345 -0.96899291
Fiat 128            32.4 2.200  0.44730718
Honda Civic         30.4 1.615 -0.86317499
Toyota Corolla      33.9 1.835 -0.94182141
Toyota Corona       21.5 2.465 -0.99341821
Dodge Challenger    15.5 3.520 -0.94720046
AMC Javelin         15.2 3.435  0.21168794
Camaro Z28          13.3 3.840 -0.90670560
Pontiac Firebird    19.2 3.845 -0.99864434
Fiat X1-9           27.3 1.935 -0.99939736
Porsche 914-2       26.0 2.140 -0.99630829
Lotus Europa        30.4 1.513 -0.99962223
Ford Pantera L      15.8 3.170 -0.93453339
Ferrari Dino        19.7 2.770 -0.96372018
Maserati Bora       15.0 3.570          NA
Volvo 142E          21.4 2.780          NA

另请参阅此SO帖子,除了data.table上下文之外,它是相似的:Rolling correlation with data.table

答案 1 :(得分:0)

我不清楚为什么你想要在3行/观察窗口内计算看起来像滚动相关的内容,但你可以在基数R中做这样的事情:

x <- lapply(seq(1, nrow(mtcars) - 2), function(x) seq(x, x + 2))

此处x是一个list,其中包含行/观察的条目,我们根据这些行/观察计算相关性。

df <- do.call(rbind, lapply(x, function(x) cor(mtcars$mpg[x], mtcars$wt[x])))
df;
#        [,1]
#[1,] -0.88845855
#[2,] -0.82589964
#[3,] -0.87097656
#[4,] -0.99520846
#[5,] -0.99985063
#[6,] -0.99534538
#[7,] -0.97267882
#[8,] -0.90784130
#[9,] -0.96247218
#[10,] -0.86602540
#[11,] -0.99308187
#[12,] -0.05428913
#[13,] -0.96311366
#[14,] -0.99534934
#[15,]  0.05301502
#[16,] -0.98658763
#[17,] -0.96899291
#[18,]  0.44730718
#[19,] -0.86317499
#[20,] -0.94182141
#[21,] -0.99341821
#[22,] -0.94720046
#[23,]  0.21168794
#[24,] -0.90670560
#[25,] -0.99864434
#[26,] -0.99939736
#[27,] -0.99630829
#[28,] -0.99962223
#[29,] -0.93453339
#[30,] -0.96372018