我认为标题主要解释了我想要做的事情。由于我对循环不太熟悉,我需要你的帮助。
我拥有的数据:
> dput(data)
structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 778936.666666667,
0, 0, 0, 0, 2478666.66666667, 2255834.16666667, 0, 1797065.41666667,
0, 0, 8091450, 10536461.5079365, 0, 2325600, 0, 0, 0, 1011700,
2049325, 870025, 0, 0, 0, 892385, 3216538.33333333, 960480, 1024325,
0, 0, 557780, 5798938.88888889, 846266.666666667, 1183267.5,
0, 0, 1126786.66666667, 7603630.47619048, 888885, 1771708.33333333,
0, 0, 1557738.33333333, 5441300, 0, 2007712.33333333, 0, 0, 1792833.33333333,
3435203.33333333, 1913650, 3339118.93939394, 0, 0, 1047475, 2194228.33333333,
1248360, 973797.916666667, 671265, 0, 804250, 0, 0, 0, 0, 0,
0, 1788100, 1746900, 2140050, 2584000, 0, 947850, 0, 462237.5,
639437.666666667, 636732.333333333, 0, 0, 0, 508568.333333333,
1397257.5, 1016524.58333333, 0, 0, 0, 270466.666666667, 742731.785714286,
408040.681818182, 0, 0, 0, 316706.666666667, 714654.722222222,
592564.294871795, 0, 0, 0, 255310, 434271.5, 590129.537037037,
0, 0, 0, 617560, 227435, 367492.5, 0, 0), .Dim = c(6L, 20L), .Dimnames = list(
c("Greg", "Tommy", "Seb", "Martin", "Alesa", "Yuri"), c("January",
"February", "March", "April", "May", "June", "July", "August",
"September", "October", "January2", "February2", "March2",
"April2", "May2", "June2", "July2", "August2", "September2",
"October2")))
该功能所需的向量:
> dput(vec_list)
c(10L, 34L, 59L, 84L, 110L, 134L, 165L, 199L, 234L, 257L, 362L,
433L, 506L, 581L, 652L, 733L, 818L, 896L, 972L, 1039L)
现在我想要应用于整个数据的函数(比给定的例子大得多):
work_func <- function(i) data[1,] <- AIC(lm(vec_list~poly(data[1,],i, raw=TRUE)))
as.integer(optimize(work_func,interval = c(1,length(data[1,])-1))$minimum)
那只是一排。每行的结果应该只是一个简单的数字,我想把它放到新列中,或者只是将它存储为一个向量...
答案 0 :(得分:5)
正如@Colonel正确指出的那样,你可以在这里使用apply
,保证金为1
My_func <- function(x) {
work_func <- function(i) AIC(lm(vec_list ~ poly(x, i, raw = TRUE)))
as.integer(optimize(work_func, interval = c(1, length(x) - 1))$minimum)
}
apply(data, 1, My_func)
# Greg Tommy Seb Martin Alesa Yuri
# 2 12 12 6 18 18
答案 1 :(得分:1)
请注意work_func
仅对i
的整数值有意义,并且是不连续的,因此optimize
可能不是正确的策略,而是我一直在寻找所有整数值。使用您的数据,
optim_fun <- function(x){
work_fun <- function(i) AIC(lm(vec_list~poly(x,i, raw=TRUE)))
which.min(sapply(1:(length(x)-1),work_fun))
}
AIC <- apply(data,1,optim_fun)
产生输出
> AIC
# Greg Tommy Seb Martin Alesa Yuri
# 1 12 15 6 1 2
这是多项式的阶数,它使每行的AIC最小化。
为了解释这一点,我刚刚使用i
中设置的数据x
更改了work_fun以返回功率optim_fun
的AIC。 optim_fun
以work_fun
的整数值评估i
,并找到最小化此值的i
。最后一行依次将其应用于数据的每一行。
几乎与David Arenburg同时发布,所以我会快速评论为什么我们会得到不同的结果 - 这取决于使用optimize
。我的答案发现Greg值略低:
> work_fun(1)
[1] 294.0098
> work_fun(2)
[1] 294.1508
请注意,对于Seb:
> work_fun(12)
[1] 268.0117
> work_fun(13)
[1] 268.0117
> work_fun(14)
[1] 268.0117
> work_fun(15)
[1] 268.0117
同样,我认为我的回答对Yuri来说更好,但是所有i
给予Alesa相同的AIC,所以答案是不确定的。