Как извлечь остаточную стандартную ошибку из скользящих регрессий - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь получить остаточное стандартное отклонение (остаточная стандартная ошибка в R-сводках) для скользящих регрессий. Я пытаюсь провести регрессионную регрессию на 20-дневном возврате акций в общей сложности 4000 дней. Я могу делать регрессии прокрутки, и я могу получить остаточное стандартное отклонение от регулярной регрессии lm, но не для регрессии прокрутки. Мои данные похожи на следующие, где фрейм данных содержит возврат нескольких акций, а вектор представляет собой возврат индекса:

data<-as.data.frame(matrix(rexp(20000, rate=.1), ncol=20))

vector<-rexp(1000,rate=0.1)

Я могу произвести сигму для регрессии lm: sigma(lm(data$V1~vector))

Я могу произвести скользящую регрессию с library(roll) и roll_lm(vector,data$V1,width=20) и с library(rollRegres) и roll_regres(data$V1~vector,width=20)

Есть ли способ получить остаточную стандартную ошибку / остаточное стандартное отклонение / сигма от таких скользящих регрессий?

Я хотел бы получить кадр данных, содержащий только остаточные стандартные отклонения.

Спасибо!

1 Ответ

0 голосов
/ 04 апреля 2020

Если вы читаете код для summary.lm, остаточная стандартная ошибка представляет собой квадрат root остаточной суммы квадратов (rss) / степени свободы остатков (rdf). Поскольку roll_lm не сохраняет это, вам нужно использовать коэффициенты, чтобы получить прогноз и вычислить его снова:

data<-as.data.frame(matrix(rexp(20000, rate=.1), ncol=20))
vector<-rexp(1000,rate=0.1)

library(roll)
WI = 20
rlm = roll_lm(vector,data$V1,width=WI)
rdf = WI - ncol(rlm$coefficients)

Ниже мы go пройдем через каждое окно, получим прогноз и вычислим rss и оттуда получить сигма:

sigma = sapply(1:(nrow(data)-WI+1),function(i){
# basically intercept + predictor * coef
pred = cbind(rep(1,WI),vector[i:(i+WI-1)]) %*% rlm$coefficients[WI+i-1,]
rss = sum((data$V1[i:(i+WI-1)] - pred)^2)
sqrt(rss/rdf)
})

Мы можем заключить это в функцию, которая принимает в качестве входных данных x, y:

roll_w_sigm = function(x,y,WI=20){

rlm = roll_lm(x=vector,y=y,width=WI)
rdf = WI - ncol(rlm$coefficients)

rlm$sigma = sapply(1:(length(y)-WI+1),function(i){
    pred = cbind(rep(1,WI),vector[i:(i+WI-1)]) %*% rlm$coefficients[WI+i-1,]
    rss = sum((y[i:(i+WI-1)] - pred)^2)
    sqrt(rss/rdf)
    })
rlm
}

Для 1 столбца:

res = roll_w_sigm(vector,data$V1)
head(res$sigma)
[1] 9.102188 9.297425 9.324338 9.509460 7.849201 7.993087

Для всех столбцов:

lapply(data,function(i)roll_w_sigm(vector,i))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...