Это не полный ответ, а начало.
Во-первых, я считаю ошибкой разбивать набор данных на разные объекты. Это только усложняет обработку. Лучше было бы добавить индикаторную переменную в ваш фрейм данных, например
> mydata <- as.data.frame(matrix(round(rnorm(480*7),1), ncol=7))
> names(mydata) <- c("USA", paste("country", 1:6, sep=""))
>
> mydata$decade <- rep(c("seventies", "eighties", "nineties", "twenties"), rep(120,4))
>
> head(mydata)
USA country1 country2 country3 country4 country5 country6 decade
1 0.2 -0.1 0.8 0.9 -1.6 -0.1 -1.1 seventies
2 0.0 -0.5 0.1 -0.4 -1.2 -0.9 1.3 seventies
3 2.2 1.4 1.7 1.0 -1.6 -1.5 0.6 seventies
4 -0.5 2.5 0.2 -0.9 2.3 1.0 0.1 seventies
5 -0.1 0.0 -0.9 -1.4 0.7 -0.1 -0.1 seventies
6 0.3 -0.4 0.1 0.5 0.2 0.9 -0.5 seventies
Мой второй совет - преобразовать это в длинный формат, используя библиотеку reshape или reshape2, например
> library(reshape2)
> mydata.m <- melt(mydata, id.vars=c("USA", "decade"))
> head(mydata.m)
USA decade variable value
1 0.2 seventies country1 -0.1
2 0.0 seventies country1 -0.5
3 2.2 seventies country1 1.4
4 -0.5 seventies country1 2.5
5 -0.1 seventies country1 0.0
6 0.3 seventies country1 -0.4
Отсюда у вас есть ряд вариантов. Вы можете использовать tapply() из базы или что-то из пакета plyr. Вы даже можете подогнать ее как одну большую модель с взаимодействием между переменной и десятилетием (дает результаты, аналогичные, но не идентичные вашим 24 моделям, что позволит разделить оценки остаточной дисперсии). например, с tapply начните с:
> country <- with(mydata.m, tapply(USA, list(decade, variable), function(x){x}))
> country
country1 country2 country3 country4 country5 country6
eighties Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120
nineties Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120
seventies Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120
twenties Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120 Numeric,120
> country[1,1]
[[1]]
[1] 0.2 1.1 0.2 0.1 -0.1 2.1 -2.4 -0.5 -0.5 -0.3 0.1 -0.9 -0.6 -0.1 0.8 0.9 0.4 0.6 -0.5 0.4
[21] -1.3 0.9 0.0 -1.0 0.2 -0.2 0.0 -0.5 0.0 1.4 0.7 -0.9 -1.1 1.7 0.5 -1.0 1.1 0.1 0.3 0.8
[41] -0.5 -1.9 -1.5 -0.2 0.5 -0.8 -1.2 1.0 0.3 1.7 -0.5 1.2 -0.1 0.9 0.9 0.5 -1.8 0.7 0.1 0.7
[61] 0.4 0.2 -0.7 2.1 0.2 -1.1 -1.4 1.7 -0.4 -1.0 0.0 1.0 -0.6 1.5 0.4 0.3 -0.2 -1.0 -0.8 1.0
[81] 0.4 -0.3 1.2 0.9 -0.8 0.2 -0.7 -1.3 0.4 -0.7 0.7 1.5 -0.7 -0.3 -2.3 0.3 0.6 -0.9 -0.5 0.4
[101] 0.4 -0.8 0.2 0.2 0.3 -1.0 -1.0 0.6 -2.8 -0.2 2.7 1.1 -0.5 -0.1 -0.6 -0.6 -0.2 0.1 0.0 -0.9
и так далее. Пакет plyr, вероятно, даст вам какой-нибудь элегантный способ подгонки моделей, позволяющий избежать постукивания. Дальнейшие действия будут частично зависеть от того, как вы хотите сохранить результаты модели — хотите ли вы всю модель целиком или только сводную статистику по каждой из них и т. д.
Я бы не боялся использовать циклы в какой-то момент, если это окажется необходимым. Циклы почти всегда являются плохой идеей в R для выполнения чего-то одного элемента за раз в векторе, но использование их для выполнения чего-то одной модели за раз может иногда быть более прозрачным для читателя кода, чем более эзотерические операции. Когда данные подсчитываются тысячами строк, а не миллионами, скорость работы не будет проблемой (ваш набор данных здесь, например, довольно мал), поэтому прозрачность кода и простота проверки становятся реальным критерием при выборе вашей программы. подход.
person
Peter Ellis
schedule
29.01.2013