как создать сразу много линейных моделей и поместить коэффициенты в новую матрицу?

У меня 365 столбцов. В каждом столбце у меня есть 60 значений. Мне нужно знать скорость изменения во времени для каждого столбца (наклон или линейный коэффициент). Я создал общий столбец в виде ряда чисел от 1:60, чтобы представить 60 соответствующих временных интервалов. Я хочу создать 356 моделей линейной регрессии, используя общий столбец меток времени с каждым из 365 столбцов данных.

Другими словами, у меня много столбцов, и я хотел бы создать сразу много моделей линейной регрессии, извлечь коэффициенты и поместить эти коэффициенты в новую матрицу.


person MelissaThaw    schedule 14.11.2014    source источник
comment
Это возможно, если кто-то держит пистолет у вашей головы, но это настолько грязно по статистике, что вам нужно будет принять душ и оттереть себя скипидарным мылом.   -  person IRTFM    schedule 14.11.2014
comment
Я получаю коэффициенты изменения уровня грунтовых вод за каждую ночь (пополнение, когда ET незначителен), чтобы рассчитать эвапотранспирацию с использованием метода Уайта.   -  person MelissaThaw    schedule 19.11.2014
comment
Возможно, если вы проанализируете коэффициенты как коррелированные временные ряды, это может иметь смысл. То, как это было описано, навело меня на мысль, что вы занимаетесь поиском значимых моментов времени.   -  person IRTFM    schedule 19.11.2014
comment
Спасибо за ваш вклад - я не хочу делать плохую статистику.   -  person MelissaThaw    schedule 20.11.2014


Ответы (2)


Во-первых, статистически это может быть не лучший подход к анализу временных данных. Хотя, что касается подхода, который вы предлагаете, очень просто построить цикл, чтобы получить это:

Coefs <- matrix(,ncol(Data),2)#Assuming your generic 1:60 column is not in the same object
for(i in 1:ncol(Data)){
Coefs[i,] <- lm(Data[,i]~GenericColumn)$coefficients
} 
person LeoRJorge    schedule 14.11.2014
comment
Благодарю вас! Я использовал это, и похоже, что это работает. Я попробовал этот, потому что он показался мне достаточно простым для понимания. - person MelissaThaw; 19.11.2014

Вот как это сделать:

# Fake data
dat = data.frame(x=1:60, y1=rnorm(60), y2=rnorm(60), 
                 y3=rnorm(60))

t(sapply(names(dat)[-1], function(var){
   coef(lm(dat[,var] ~ x, data=dat))
}))

   (Intercept)            x
y1  0.10858554 -0.004235449
y2 -0.02766542  0.005364577
y3  0.20283168 -0.008160786

А где скипидарное мыло?

person eipi10    schedule 14.11.2014