Как отформатировать данные с указанием страны и года для регрессии в R?

У меня есть несколько наборов данных с объясняющей переменной, которую я хочу использовать для объяснения нескольких других зависимых переменных. Данные получены с течением времени, и пояснительная переменная в настоящее время находится в формате, приведенном ниже (назовите ее объясняющий_индекс).

         1900  1901   ... 2000
Country1  327.1 253.5 ... 537.9
Country2  357.3 300.9 ... 510.7
...       ...   ...   ... ...
Country40 225.7 258.2 ... 451.4 

и формат по умолчанию для зависимых переменных будет в том же формате. Допустим, у меня есть зависимая переменная (назовем ее ВВП), которая выглядит как

         1900  1901   ... 2000
Country1  18   25     ... 93
Country2  20   15     ... 78
...       ...   ...   ... ...
Country40 4    7      ... 85

А затем еще несколько с аналогичным форматом, скажем (market_size) и т. Д .:

         1900  1901   ... 2000
Country1  7    9      ... 25
Country2  9    11     ... 27
...       ...  ...    ... ...
Country40 0    1      ... 8

Я хочу запустить линейную регрессию, используя независимую переменную (объяснительный индекс) для каждой переменной отдельно, и получить «общую» линейную регрессию.

Базовый lm(GDP ~ explanatory_index) просто выдает ошибки, как я и ожидал, и я не хочу проводить регрессию по каждой стране отдельно или каждый год отдельно, поскольку идея состоит в том, чтобы показать, что индекс имеет значительную объясняющую силу по странам и во времени, и может объяснить определенные элементы роста.

Может, мне лучше попытаться преобразовать данные, чтобы они выглядели примерно так:

               Explanatory_Index GDP market_size  
Country1_1900  327.1             18  7
Country1_1901  253.5             25  9
...
Country1_2000  537.91            93  25
...            ...               ... ...
Country40_1900 225.7             4   0
Country40_1901 258.2             7   1
...            ...               ... ...
Country40_2000 451.4             85  8

На котором я мог бы просто запустить lm(df$GDP, df$explanatory_index)? или есть способ сделать это с исходным форматом данных?

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


person John Doe    schedule 11.03.2018    source источник
comment
посмотрите на tidyr::gather и tidyr::unite   -  person Davide Passaretti    schedule 11.03.2018
comment
Можете ли вы помочь мне и в следующей проблеме stackoverflow.com/q/58435338/9812604   -  person user9812604    schedule 25.10.2019


Ответы (1)


Последняя таблица будет наиболее подходящей для lm

Вы можете сделать что-то вроде ниже. Я сделал всего 2 стола. Вы можете расширить все до того количества столов, которое у вас есть.

library(dplyr)
library(tidyr)

df1 <- df1 %>% gather(year, value = index, -country) %>% 
  unite("country_year", c("country", "year"))

df2 <- df2 %>% gather(year, value = gdp, -country) %>% 
  unite("country_year", c("country", "year"))

# assuming identical number of rows in country_year, otherwise use a different join
total <- inner_join(df1, df2, by ="country_year")

    country_year index gdp
1  Country1_1900 327.1  18
2  Country2_1900 357.3  20
3 Country40_1900 225.7   4
4  Country1_1901 253.5  25
5  Country2_1901 300.9  15
6 Country40_1901 258.2   7
7  Country1_2000 537.9  93
8  Country2_2000 510.7  78
9 Country40_2000 451.4  85

пример данных:

df1 <- structure(list(country = c("Country1", "Country2", "Country40"), 
                      x1900 = c(327.1, 357.3, 225.7), 
                      x1901 = c(253.5, 300.9, 258.2), 
                      x2000 = c(537.9, 510.7, 451.4)), 
                 .Names = c("country", "1900", "1901", "2000"), 
                 class = "data.frame", 
                 row.names = c(NA, -3L))


df2 <- structure(list(country = c("Country1", "Country2", "Country40"), 
                      x1900 = c(18, 20, 4), 
                      x1901 = c(25, 15, 7), 
                      x2000 = c(93, 78, 85)), 
                 .Names = c("country", "1900", "1901", "2000"), 
                 class = "data.frame", 
                 row.names = c(NA, -3L))
person phiver    schedule 11.03.2018