使用which.min和函数系数

时间:2014-01-21 20:30:34

标签: r

我有以下矢量:

x<-c(1,1,3,8,5,2,4,3,1,1,0,5,1,1,3,4,6,7,8,9,4,2,1,2,3,4,6,7,8,1,2,3,5,7,9)

我在以下函数模型中使用递增(-1)滞后版本的x来测试哪个滞后在以下函数中提供较低的AIC结果。 Lag()函数来自包* quantmod

library("quantmod")
a1 <- glm(x[1:length(x)] ~ Lag(x,1))
a2 <- glm(x[1:length(x)] ~ Lag(x,2)) 
a3 <- glm(x[1:length(x)] ~ Lag(x,3)) 
a4 <- glm(x[1:length(x)] ~ Lag(x,4)) 
a5 <- glm(x[1:length(x)] ~ Lag(x,5)) 
a6 <- glm(x[1:length(x)] ~ Lag(x,6)) 
a7 <- glm(x[1:length(x)] ~ Lag(x,7)) 
a8 <- glm(x[1:length(x)] ~ Lag(x,8)) 
a9 <- glm(x[1:length(x)] ~ Lag(x,9)) 
a10 <- glm(x[1:length(x)] ~ Lag(x,10))

另一方面,我想在a1[[11]] ...中提取AIC系数,并找到从a1a10的最小AIC。我这样做,但我得到以下错误。

which.min(a1[[11]],a2[[11]],a3[[11]],a4[[11]],a5[[11]],a6[[11]],a7[[11]],a8[[11]],
a9[[11]],a10[[11]])
Error en which.min(a11[[11]], a22[[11]], a33[[11]], a44[[11]], a55[[11]],  : 
unused arguments (a22[[11]], a33[[11]], a44[[11]], a55[[11]], a66[[11]], a77[[11]],   
a88[[11]], a99[[11]], a1010[[11]])

你会发生怎样才能提取并在可能的情况下同时计算which.min

3 个答案:

答案 0 :(得分:2)

如果您采用更多R-ish方法来做这件事会有所帮助,例如使用您的数据

x <- c(1,1,3,8,5,2,4,3,1,1,0,5,1,1,3,4,6,7,8,9,4,2,1,2,3,4,6,7,8,1,2,3,5,7,9)

您可以在一次通话中使用模型:

mods <- lapply(seq_len(10), function(i, x) {glm(x ~ Lag(x, i))}, x = x)

可以方便地将模型排列在列表中,您可以迭代它。

第二个提示是使用提取器功能。您不需要知道在哪里寻找AIC,只需使用AIC()泛型。将其与sapply()结合使用,我们得到拟合模型的AIC值向量:

sapply(mods, AIC)

R> sapply(mods, AIC)
 [1] 156.8 163.0 158.0 150.4 147.1 144.2 141.1 134.5 131.6 126.7

由于这是值的 vector ,我们现在可以使用which.min()

which.min(sapply(mods, AIC))

R> which.min(sapply(mods, AIC))
[1] 10

您的呼叫失败的原因是您将10个向量(每个长度为1)传递给which.min()函数,在该函数中期望从中选择最小值的单个向量。您可以使用c()将它们连接在一起,但最好采用更好的方法来拟合和存储模型,如果您调用正确的工具,R将为您完成。

最后,请注意which.min();如果两个或多个元素采用最小值,which.min()将返回这些最小值中的第一个。为了防守,你可以这样做:

vals <- sapply(mods, AIC)
which(vals == min(vals))

R> vals <- sapply(mods, AIC)
R> which(vals == min(vals))
[1] 10

答案 1 :(得分:0)

b<-c(a1[[11]],a2[[11]],a3[[11]],a4[[11]],a5[[11]],a6[[11]],a7[[11]], a8[[11]],   
a9[[11]],a10[[11]])
which(b == min(b))

答案 2 :(得分:0)

以下内容为您的向量提取增量滞后值的aic数字,但是您确定您正在做的事情有意义吗?我对你正在使用的实际功能并不熟悉,但是你的最小数字基本上是你尝试的最大偏移量是非常可疑的(为了得到你的答案,你会做which.min结果如下):

sapply(
  1:(length(x) - 2L), 
  function(y) glm(formula=x ~ Lag(x, y))$aic
)
# [1] 156.758055 162.994470 158.022507 150.382848 147.112939 144.217309 141.115049 134.461170
# [9] 131.556481 126.682320 119.779543 116.410508 110.665231 104.261180  97.765081  94.042869
# [17]  92.527751  86.122867  81.247572  75.982221  72.414620  67.337715  61.407616  57.108097
# [25]  52.830527  41.671213  41.808836  40.550707  34.626992  24.341564  17.195847  13.297236
# [33]   9.675754