Как сделать линейные регрессии с xts
? lm(xtsObject ~ index(xtsObject))
не работает, я пробовал.Линейная регрессия с объектом XTS
Мои данные - это ежедневная цена акций компании. но index
дает секунды с эпохи до lm
функции. Как решить?
Как сделать линейные регрессии с xts
? lm(xtsObject ~ index(xtsObject))
не работает, я пробовал.Линейная регрессия с объектом XTS
Мои данные - это ежедневная цена акций компании. но index
дает секунды с эпохи до lm
функции. Как решить?
Извлеките данные из xtsObject
и указатель времени (как вы уже это сделали) в кадр данных, указав каждое подходящее имя. Обратитесь к переменным в формуле, используя это имя, и передайте в качестве данных аргумента этот фрейм данных. Например, используя данные примера в ?xts
:
require("xts")
data(sample_matrix)
xtsObject <- as.xts(sample_matrix, descr="my new xts object")
## the example ts has several variables Open High Low Close,
## here I take just one, "Open"
df <- data.frame(xtsObject['/'][,"Open"], Time = index(xtsObject))
head(df)
> head(df)
Open Time
2007-01-02 50.03978 2007-01-02
2007-01-03 50.23050 2007-01-03
2007-01-04 50.42096 2007-01-04
2007-01-05 50.37347 2007-01-05
2007-01-06 50.24433 2007-01-06
2007-01-07 50.13211 2007-01-07
Теперь подобрать модель
mod <- lm(Open ~ Time, data = df)
summary(mod)
> mod <- lm(Open ~ Time, data = df)
> summary(mod)
Call:
lm(formula = Open ~ Time, data = df)
Residuals:
Min 1Q Median 3Q Max
-1.16144 -0.47952 -0.08462 0.57053 1.44329
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.199e+02 1.199e+01 26.68 <2e-16 ***
Time -2.302e-07 1.020e-08 -22.57 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.6146 on 178 degrees of freedom
Multiple R-squared: 0.741, Adjusted R-squared: 0.7395
F-statistic: 509.2 on 1 and 178 DF, p-value: < 2.2e-16
lm()
ничего не знает о XTS объекты так, если есть сомнения, сделать простую вещь и передать ему что-то оно знает о.
Примечание: вы можете сделать coredata(xtsObject)
вместо xtsObject['/']
, например.
> head(coredata(xtsObject))
Open High Low Close
[1,] 50.03978 50.11778 49.95041 50.11778
[2,] 50.23050 50.42188 50.23050 50.39767
[3,] 50.42096 50.42096 50.26414 50.33236
[4,] 50.37347 50.37347 50.22103 50.33459
[5,] 50.24433 50.24433 50.11121 50.18112
[6,] 50.13211 50.21561 49.99185 49.99185
Я считаю, что вы предложили ошибочное, но не все вместе неправильное решение. Прочтите мой ответ ниже и дайте мне знать, что вы думаете. –
Это не статистический справочный сайт, а сайт о программировании - ОП задал вопрос с данными * no *. Я составил некоторые данные и показал, как делать то, что они хотят. Это зависит от OP, чтобы решить, какой масштаб они хотят для компонента тренда - единственная проблема, которую я вижу с тем, что я на самом деле показал (не то, что я сделал бы это для своих собственных данных) заключается в том, что оценочный эффект для этой тенденции крошечный учитывая большой масштаб переменной тренда. Я могу думать о многих причинах, почему начало тренда в 0 не полезно - альтернативой будет центрирование временной переменной. –
Я, соответственно, не согласен. Если вы знаете, что тренд времени начинается с уровня 1167724800, ваш подход прекрасен. Однако результаты этого подхода не очень читаемы. Вот почему на практике люди выбирают тренды времени, начинающиеся с 1 или 0 (https://en.wikipedia.org/wiki/Linear_trend_estimation). Например, если тренд времени начинается с единицы, то перехват представляет собой среднее значение данных. По этой причине я предлагаю людям рассмотреть подходы, которые я изложил ниже. Дополнительно, использование 'dynlm' или' dyn' имеет больше смысла, чем преобразование в 'data.frame' для использования' lm'. –
Решение Gavin Simpson опасно. Чтобы увидеть это, обратите внимание, что при выполнении регрессии выше тренда времени as.numeric(df$Time)
. Это время начинается с 1167724800. Обычно тренды времени начинаются с 0. Это важно, потому что, если вы не знаете о происхождении тренда времени, вы неправильно интерпретируете свои оценки коэффициентов. Я предложил несколько лучших альтернатив ниже.
data(sample_matrix)
xtsObject <- as.xts(sample_matrix, descr="my new xts object")
#Option 1, the best by far, no need to transform to a data.frame
library(dynlm)
dynlm(Open ~ trend(Open), data = xtsObject)
#Option 2, another option
library(dynlm)
xtsObject$t <- 0:(nrow(xtsObject)-1)
dynlm(Open ~ t, data = xtsObject)
#Option 3, the data.frame route
df <- data.frame(xtsObject['/'][,"Open"], t = 1:nrow(xtsObject))
lm(Open ~ t, df)
Мой ответ: * не * опасно. Это не сайт для статистических консультаций. Я показал один способ использовать R, чтобы получить то, что хотел OP. Ваша мысль о том, чтобы не «знать о происхождении ...», является аргументом соломы. Можно было бы надеяться, что если бы кто-то подгонял регрессию с данными, то знал бы, как их данные форматируются/кодируются и действуют соответственно. –
Пакет dyn может выполнять регрессию на объектах зоопарка. –