Как выполнить пошаговую / сплайн-регрессию для ряда продольных температур в R (Новое обновление)? - PullRequest
0 голосов
/ 13 июня 2018

Здесь у меня есть данные панели временных рядов температуры, и я собираюсь запустить для них кусочную регрессию или регрессию кубического сплайна.Итак, сначала я быстро изучил концепции кусочной регрессии и ее базовую реализацию в R в SO, и получил первоначальное представление о том, как продолжить мой рабочий процесс.В своей первой попытке я попытался запустить сплайн-регрессию, используя splines::ns в splines пакете, но я не получил правильную гистограмму.Для меня может сработать использование базовой регрессии, кусочной регрессии или сплайн-регрессии.

Вот общая картина моей спецификации данных панели: в первом ряду, показанном ниже, указаны мои зависимые переменные, которые представлены в натуральных логарифмических терминах инезависимые переменные: средняя температура, общее количество осадков и 11 температурных бункеров, а ширина каждого бункера (AKA, окно бункера) составляет 3 градуса Цельсия.(<-6, -6 ~ -3, -3 ~ 0, ...> 21).

воспроизводимый пример :

Вот воспроизводимые данные, которыесмоделированы с данными панели временных рядов фактической температуры:

set.seed(1) # make following random data same for everyone
dat <- data.frame(index=rep(c("dex111", "dex112", "dex113", "dex114", "dex115"), 
                          each=30),
                year=1980:2009,
                region= rep(c("Berlin", "Stuttgart", "Böblingen", 
                              "Wartburgkreis", "Eisenach"), each=30),
                ln_gdp_percapita=rep(sample.int(40, 30), 5), 
                ln_gva_agr_perworker=rep(sample.int(45, 30), 5),
                temperature=rep(sample.int(50, 30), 5), 
                precipitation=rep(sample.int(60, 30), 5), 
                bin1=rep(sample.int(32, 30), 5), 
                bin2=rep(sample.int(34, 30), 5), 
                bin3=rep(sample.int(36, 30), 5),
                bin4=rep(sample.int(38, 30), 5), 
                bin5=rep(sample.int(40, 30), 5), 
                bin6=rep(sample.int(42, 30), 5),
                bin7=rep(sample.int(44, 30), 5), 
                bin8=rep(sample.int(46, 30), 5), 
                bin9=rep(sample.int(48, 30), 5),
                bin10=rep(sample.int(50, 30), 5), 
                bin11=rep(sample.int(52, 30), 5))

Обратите внимание, что каждый бин имеет одинаково разделенный температурный интервал, за исключением своего экстремального значения температуры, поэтому каждый бин дает количество дней, которые попадают в соответствующий температурный интервал.

обновление 2: спецификация регрессии :

Вот моя спецификация регрессии:

enter image description here

Где районы индексируются i, а годы индексируются t.y_it - это мера выхода, y_it∈ {ln GDP per capita, ln GVA per capita (by six sectors respectively)}, μ_i - набор фиксированных эффектов округа, которые учитывают ненаблюдаемые постоянные различия между округами.θ_t - это набор фиксированных по году эффектов, которые гибко учитывают общие тенденции.T_it ^ m is the number of days in the district i and year t`, которые имеют однодневную среднюю температуру в mth температурном интервале.Каждый внутренний температурный контейнер имеет ширину 3..Мне нужно добавить двухстороннее исправление (фиксированное по году и фиксированное по району), когда я запускаю на нем сплайн-регрессию.

Новое обновление 1 :

Здесь я хочупереопределить мое намерение полностью.Недавно я нашел очень интересный пакет R, plm, который хорошо работает для данных панели.Вот мое новое решение с использованием plm, которое прекрасно работает:

library(plm)
pdf <- pdata.frame(dat, index = c("region", "year"))
model.b <- plm(ln_gdp_percapita ~ bin1+bin2+bin3+bin4+bin5+bin6+bin7+bin8+bin9+bin10+bin11, data = pdf, model = "pooling", effect = "twoways")

library(lmtest)    
coeftest(model.b)
res <- summary(model.b, cluster=c("c"))  ## add standard clustered error on it

Новое обновление 3 :

summary(model.b, cluster=c("c"))$coefficients  # only render coefficient estimates table

Новое обновление 2: моеoutput :

    > coeftest(model.b)

t test of coefficients:

         Estimate  Std. Error t value  Pr(>|t|)    
bin1   1.7773e-04  4.8242e-04  0.3684 0.7125716    
bin2   2.4031e-03  4.3999e-04  5.4617 4.823e-08 ***
bin3   7.9238e-04  3.9733e-04  1.9943 0.0461478 *  
bin4  -2.0406e-05  3.7496e-04 -0.0544 0.9566001    
bin5   9.9911e-04  3.6386e-04  2.7459 0.0060451 ** 
bin6   6.0026e-05  3.4915e-04  0.1719 0.8635032    
bin7   2.5621e-04  3.0243e-04  0.8472 0.3969170    
bin8  -9.5919e-04  2.7136e-04 -3.5347 0.0004099 ***
bin9  -1.8195e-04  2.5906e-04 -0.7023 0.4824958    
bin10 -5.2064e-04  2.7006e-04 -1.9279 0.0538948 .  
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

нужный график рассеяния :

Ниже приведен график рассеяния, который я хочу получить.Это всего лишь смоделированный график рассеяния, навеянный страницей 32 рабочего документа NBER под названием Влияние температуры на производительность и перераспределение факторов: данные полумиллиона китайских производственных предприятий - доступна версия без шлюза здесь , а ориентацию страницы можно исправить по всему файлу, запустив в командной строке следующее:
pdftk w23991.pdf cat 1-31 32-37east 38-40 41east 42-44 45east 46 output w23991-oriented.pdf

Требуемый точечный график:

enter image description here

На этом графике черная точечная линия представляет собой оценочный коэффициент регрессии (либо базовой линии, либо ограниченной сплайн-регрессии), а точечная синяя линия - это 95% доверительный интервал, основанный на кластерных стандартных ошибках.

Я только что связалсяс автором статьи, и они просто используют Excel, чтобы получить этот сюжет.В основном, они просто использовали Estimate, правую и левую сторону 95-процентного доверительного интервала для построения графика.Я знаю, что подобный сюжет в Excel безумно прост, но мне интересно сделать это в R.Это выполнимо?Любая идея?

Я бы хотел более программный подход к визуализации графика, используя R вместо Excel.Любой умный ход?

1 Ответ

0 голосов
/ 24 июня 2018

Предисловие: я совсем не знаком со статистикой, лежащей в основе этого вопроса.Далее следует, возможно, полезно начать работу с ggplot2.Дайте мне знать, что вы думаете.

set.seed(1) # make following random data same for everyone
dat <- data.frame(index=rep(c("dex111", "dex112", "dex113", "dex114", "dex115"), 
                              each=30),
                    year=1980:2009,
                    region= rep(c("Berlin", "Stuttgart", "Böblingen", 
                                  "Wartburgkreis", "Eisenach"), each=30),
                    ln_gdp_percapita=rep(sample.int(40, 30), 5), 
                    ln_gva_agr_perworker=rep(sample.int(45, 30), 5),
                    temperature=rep(sample.int(50, 30), 5), 
                    precipitation=rep(sample.int(60, 30), 5), 
                    bin1=rep(sample.int(32, 30), 5), 
                    bin2=rep(sample.int(34, 30), 5), 
                    bin3=rep(sample.int(36, 30), 5),
                    bin4=rep(sample.int(38, 30), 5), 
                    bin5=rep(sample.int(40, 30), 5), 
                    bin6=rep(sample.int(42, 30), 5),
                    bin7=rep(sample.int(44, 30), 5), 
                    bin8=rep(sample.int(46, 30), 5), 
                    bin9=rep(sample.int(48, 30), 5),
                    bin10=rep(sample.int(50, 30), 5), 
                    bin11=rep(sample.int(52, 30), 5))

library(plm)
pdf <- pdata.frame(dat, index=c("region", "year"))
model.b <- plm(ln_gdp_percapita ~ 
               bin1+bin2+bin3+bin4+bin5+bin6+bin7+bin8+bin9+bin10+bin11,
                   data=pdf, model="pooling", effect="twoways")
pdf$ln_gdp_percapita_predicted <- plm:::predict.plm(model.b, pdf)

library(ggplot2)
x <- ggplot(pdf, aes(y=ln_gdp_percapita_predicted, x=temperature))+
            geom_point()+
            geom_smooth(method=lm, formula=y~x, se=TRUE, level=.95)+ # see ?geom_smooth
            ylab("ln_gdp_percapita_predicted")+
            ggtitle("ln_gdp_percapita modeled as temperature")

ggsave("scatter_plot_2.png")
x

enter image description here

Ссылка: R: Прогнозирование модели панели построения графиков с использованием plm & pglm

Обновление:

Создание графика из res (подробнее см. ??coefplot):

res <- plm:::summary.plm(model.b, cluster=c("c"))

library(coefplot)
coefplot::coefplot(res)
ggsave("model.b.coefplot.png")

enter image description here

...