在 Dataframe 的新列中添加循环内box.test的结果

nxowjjhe  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(138)

我有一个包含许多时间序列的数据集,我想使用箱形检验来检查每个序列的平稳性,我的循环可以很好地进行检验,但是我如何将结果(x²和p值)导出到现有的数据框(每个时间序列作为行)作为新列?
下面是我的 Dataframe 示例:

a <- c(0.2569, 0.0145896, 0.0369, 0.025986, 0.12569, 0.3695)
b <- c(0.125, 0.04582, 0.2569, 0.256369, 0.25698, 0.1456)
c <- c(0.2584, 0.05698, 0.1258, 0.2569, 0.098563, 0.1569)

df <- data.frame(a,b,c)

这个循环运行良好,给予我每个时间序列的x²和p值:

for(i in 1:ncol(df)) {       
  box <- Box.test(df[ , i] <- df[ , i], type = "Ljung-Box")
  print(box)
}

现在,结果应传输到 Dataframe 中的空列,如下所示:

d <- c("series1", "series2", "series3")
e <- c("green", "black", "red")
f <- c(18, 24, 12)
p_value <- NA  #to create an empty column
x <- NA   

df2 <- data.frame(d,e,f,p_value,x)

我的第一个想法是:

df2$p_value <- box$p.value

但是这里我在每一行都得到了相同的p值。
我想,我必须用一个新的循环来完成它,但这里我不知道如何实现“df 2 [i,]〈-df 2 [i,]”它:

for(i in 1:nrow(df2)) {       
    df2$p_value <- box$p.value(df2[i , ] <- df2[i ,])
}

这个坏了,谁能帮帮我,换个功能?

jm81lzqq

jm81lzqq1#

可以使用sapply和subset作为p值。

bres <- sapply(df, \(x) Box.test(x, type="Ljung-Box")[['p.value']])

我强烈建议明确地制定字典a以避免错误。

a <- setNames(c("series1", "series2", "series3"), c('a', 'b', 'c'))

然后cbind

cbind(df2, p_value=bres[match(df2$d, a)])
#         d     e  f   p_value
# a series1 green 18 0.8206314
# b series2 black 24 0.6379121
# c series3   red 12 0.1574567
  • 数据:*
df <- structure(list(a = c(0.2569, 0.0145896, 0.0369, 0.025986, 0.12569, 
0.3695), b = c(0.125, 0.04582, 0.2569, 0.256369, 0.25698, 0.1456
), c = c(0.2584, 0.05698, 0.1258, 0.2569, 0.098563, 0.1569)), row.names = c(NA, 
-6L), class = "data.frame")

df2 <- data.frame(d=c("series1", "series2", "series3"),
                  e=c("green", "black", "red"),
                  f=c(18, 24, 12))

相关问题