Я пытаюсь оптимизировать небольшой алгоритм, который я сделал для выполнения обратного выбора в области регрессии сплайна.
Основное, что делает алгоритм:
Возьмите k
вектор узлов с n
компонентами.
Устранить i-й компонент, i=1,...,n
.
Оценить сплайн-регрессию, используя вектор узла k[-i]
, i=1,...,n
.
Выберите вариант с меньшей Остаточной суммой квадратов (RSS
) и оцените BIC для этой модели.
Пусть k=k[-which.min(RSS)]
.
Запустите алгоритм снова до n=1
.
Мой код
library(splines)
prune<-function(K,y0,x,deg=3){
KNOTS<-matrix(nrow = (length(K)),ncol=(length(K)-1))
y<-y0
BIC<-vector(length =(length(K)-1) )
for(j in 1:(length(K)-1)){
RSS<-vector(1:(length(K)))
{for(i in 1:(length(K)))
RSS[i]<-sum((y-lm(y~bs(x,knots = K[-i],Boundary.knots = c(min(x),max(x)),degree = deg,intercept = T)-1)$fitted.values)^2)
}
K<-K[-which.min(RSS)]
for (k in 1:(length(K)))
KNOTS[k,j]<-K[k]
BIC[j]<-BIC(lm(y~bs(x,knots = K,Boundary.knots = c(min(x),max(x)),degree = deg,intercept = T)-1))
}
KSTAR<-as.vector(KNOTS[, which.min(BIC)])
I<-which.min(BIC)
KSTAR<-na.omit(KSTAR)
return(list(KSTAR,KNOTS,I))
}
, где K
- вектор узла, y0
- зависимая переменная, x
- независимая переменная и deg
- степень B-сплайнов.
Проблема в том, что когда у меня много наблюдений, скажем, 5000 или 10000, для вычисления результата требуется слишком много.
Мои навыки программирования на R довольно просты, и, вероятно, есть вещи, которые можно написать по-другому, чтобы увеличить скорость.
Не могли бы вы дать мне совет?
Я читал некоторые блоги об ускорении кода R, но, честно говоря, я не понимаю, как можно применить такие вещи, как предварительное распределение, векторизация и т. Д.
для примера можно начать с
x=(0:4000)/4000
y=sin(4*x)+2*exp(-30*(4*x)^2)+rnorm(4000,0,0.1)
K=seq(0,4000,by=100)
Я не прошу вас делать мою работу, просто ищу совет
относительно структуры алгоритма. Заранее спасибо!