Графічні коефіцієнти прокатки і колір на основі P-значення в R

Це дещо складно! Я запускаю вікно регресії і збираю всі коефіцієнти для кожного вікна. Моя мета полягає в тому, щоб побудувати, як коефіцієнт коливається протягом часу. Крім того, я хотів би, щоб сюжет давав інший колір, коли коефіцієнт був знайдений статистично значущим (скажімо, на 95%), будучи даючи іншу точку кольору, коли він не був значним.

Я досі маю:

library(plm)
coeff<-NULL
for(e in 1:39){   #44 years total for each country
      paneldata<-pdata.frame(
rbind(
subset(LaggedPannel,Country=="A")[(e):(e+5),],
subset(LaggedPannel,Country=="B")[(e):(e+5),]),
index=c("Country","Year")) #we made our new windowed panel frame


coef<-coef(summary(plm(Y~lag(Y,1),data=paneldata,model="pooling")))[2,1] #gets the coeff from a panel regression
      coeff<-c(coeff,coef)  #store coeffs
    } 
plot(coeff,type="b",col="red")

The plot yielded: the figure

Наприклад, 2-й і 4-й коефіцієнти (кулі в графіку) статистично незначні; тоді їх колір повинен був бути зеленим.

Data (LaggedPannel):

                 Age1     Age2     Age3
Australia-1973  261.156  255.699  249.954
Australia-1974  261.305  255.394  251.470
Australia-1975  258.160  253.543  250.538
Australia-1976  262.504  258.066  254.720
Australia-1977  240.086  260.846  258.418
Australia-1978  228.774  238.871  259.449
USA-1973       4100.257 4104.028 4107.409
USA-1974       4135.435 4118.422 4120.286
USA-1975       4171.648 4164.065 4134.525
USA-1976       4208.236 4187.196 4171.167
USA-1977       4240.832 4211.655 4189.650
USA-1978       4286.923 4255.092 4229.701
0
Чи можна вставити результат dput (df) , незалежно від того, чи може бути ваш файл даних df ?
додано Автор hpesoj626, джерело
додав невеликий зразок набору даних для перегляду. Вони знаходяться в панельному форматі даних. Оригінальний набір даних є досить великим, щоб поставити весь результат dput (df) . Сподіваюся, це корисно!
додано Автор Hercules Apergis, джерело
додав невеликий зразок набору даних для перегляду. Вони знаходяться в панельному форматі даних. Оригінальний набір даних є досить великим, щоб поставити весь результат dput (df) . Сподіваюся, це корисно!
додано Автор Hercules Apergis, джерело

5 Відповіді

Ось кілька модельованих даних.

library(tidyverse)
library(broom)
simfun <- function(a=0.1,B=0.05,n=200,x.sd=1,e.sd=1) {
  x <- rnorm(n, mean=0, sd=x.sd) + runif(100)
  e <-  rnorm(n, mean=0, sd=e.sd)
  y <- a+B*x+e 
  data.frame(x,y)
}

statfun <- function(d) {
  summary(lm(y~x,data=d)) %>% tidy()
}

simdata <- map(seq(50),~statfun(simfun())) %>% enframe() %>% unnest() %>% filter(term == "x")

Нижче визначається, які коефіцієнти є "значними".

simdata <- simdata %>% 
  mutate(row_number(),
         Significance = factor(p.value < 0.05)) 

Якщо ви хочете використовувати базовий ділянку , ви можете зробити це:

Significance = simdata$Significance

plot(simdata$estimate, col = ifelse(Significance==TRUE, "blue", "red"), ylab = "coeff")
lines(simdata$estimate)

enter image description here

Або за допомогою ggplot2 можна виконати такі дії:

ggplot(simdata, aes(name, estimate)) + geom_line() + geom_point(aes(color = Significance), shape = 1) +
  labs(x = "Index", y = "coeff") + theme_bw()

enter image description here

1
додано
Цікаво, але я вважаю, що ваша відповідь не узгоджується з підходом панелі. Я абсолютно незнайомий з функціями tidyverse , тому я не можу підключити вашу відповідь до моєї проблеми. Що я маю на увазі, що кожен цикл оновлює набір даних і створює в основному новий, який потім використовується в регресії панелі. Я не бачу, що це відбувається в функції map (можливо, я щось відсутній).
додано Автор Hercules Apergis, джерело
але ваша відповідь дала невелику ідею про те, як це виправити!
додано Автор Hercules Apergis, джерело

Ось кілька модельованих даних.

library(tidyverse)
library(broom)
simfun <- function(a=0.1,B=0.05,n=200,x.sd=1,e.sd=1) {
  x <- rnorm(n, mean=0, sd=x.sd) + runif(100)
  e <-  rnorm(n, mean=0, sd=e.sd)
  y <- a+B*x+e 
  data.frame(x,y)
}

statfun <- function(d) {
  summary(lm(y~x,data=d)) %>% tidy()
}

simdata <- map(seq(50),~statfun(simfun())) %>% enframe() %>% unnest() %>% filter(term == "x")

Нижче визначається, які коефіцієнти є "значними".

simdata <- simdata %>% 
  mutate(row_number(),
         Significance = factor(p.value < 0.05)) 

Якщо ви хочете використовувати базовий ділянку , ви можете зробити це:

Significance = simdata$Significance

plot(simdata$estimate, col = ifelse(Significance==TRUE, "blue", "red"), ylab = "coeff")
lines(simdata$estimate)

enter image description here

Або за допомогою ggplot2 можна виконати такі дії:

ggplot(simdata, aes(name, estimate)) + geom_line() + geom_point(aes(color = Significance), shape = 1) +
  labs(x = "Index", y = "coeff") + theme_bw()

enter image description here

1
додано
Цікаво, але я вважаю, що ваша відповідь не узгоджується з підходом панелі. Я абсолютно незнайомий з функціями tidyverse , тому я не можу підключити вашу відповідь до моєї проблеми. Що я маю на увазі, що кожен цикл оновлює набір даних і створює в основному новий, який потім використовується в регресії панелі. Я не бачу, що це відбувається в функції map (можливо, я щось відсутній).
додано Автор Hercules Apergis, джерело
але ваша відповідь дала невелику ідею про те, як це виправити!
додано Автор Hercules Apergis, джерело

Ось кілька модельованих даних.

library(tidyverse)
library(broom)
simfun <- function(a=0.1,B=0.05,n=200,x.sd=1,e.sd=1) {
  x <- rnorm(n, mean=0, sd=x.sd) + runif(100)
  e <-  rnorm(n, mean=0, sd=e.sd)
  y <- a+B*x+e 
  data.frame(x,y)
}

statfun <- function(d) {
  summary(lm(y~x,data=d)) %>% tidy()
}

simdata <- map(seq(50),~statfun(simfun())) %>% enframe() %>% unnest() %>% filter(term == "x")

Нижче визначається, які коефіцієнти є "значними".

simdata <- simdata %>% 
  mutate(row_number(),
         Significance = factor(p.value < 0.05)) 

Якщо ви хочете використовувати базовий ділянку , ви можете зробити це:

Significance = simdata$Significance

plot(simdata$estimate, col = ifelse(Significance==TRUE, "blue", "red"), ylab = "coeff")
lines(simdata$estimate)

enter image description here

Або за допомогою ggplot2 можна виконати такі дії:

ggplot(simdata, aes(name, estimate)) + geom_line() + geom_point(aes(color = Significance), shape = 1) +
  labs(x = "Index", y = "coeff") + theme_bw()

enter image description here

1
додано
Цікаво, але я вважаю, що ваша відповідь не узгоджується з підходом панелі. Я абсолютно незнайомий з функціями tidyverse , тому я не можу підключити вашу відповідь до моєї проблеми. Що я маю на увазі, що кожен цикл оновлює набір даних і створює в основному новий, який потім використовується в регресії панелі. Я не бачу, що це відбувається в функції map (можливо, я щось відсутній).
додано Автор Hercules Apergis, джерело
але ваша відповідь дала невелику ідею про те, як це виправити!
додано Автор Hercules Apergis, джерело

Використання додаткового вектора для зберігання p-значень, а потім розфарбування на основі їх значення порівняно з рівнем значущості 0,05 також вирішує питання. Зокрема:

library(plm)
coeff<-NULL
P_values<-NULL
for(e in 1:39){   #44 years total for each country
      paneldata<-pdata.frame(
rbind(
subset(LaggedPannel,Country=="A")[(e):(e+5),],
subset(LaggedPannel,Country=="B")[(e):(e+5),]),
index=c("Country","Year")) #we made our new windowed panel frame


coef<-coef(summary(plm(Y~lag(Y,1),data=paneldata,model="pooling")))[2,1] #gets the coeff from a panel regression
PV<-coef(summary(plm(Y~lag(Y,1),data=paneldata,model="pooling")))[2,4] #stores the p-values
coeff<-c(coeff,coef)
P_values<-c(P_values,PV)
    } 
plot(coeff,type="b",col="red") #previousplot

Before

 plot(coeff,col=ifelse(P_values<=0.05, "blue", "red"),ylab = "coef",type="b") 
    #new plot based on significant values:

After

Єдина проблема з цією відповіддю полягає в тому, що вона досить трудна, якщо ви маєте більше, ніж кілька змінних, які потрібно розглянути; тоді потрібно створити більше, ніж кілька порожніх векторів і так далі. Це не швидкий підхід, але, звичайно, він працює.

1
додано

Використання додаткового вектора для зберігання p-значень, а потім розфарбування на основі їх значення порівняно з рівнем значущості 0,05 також вирішує питання. Зокрема:

library(plm)
coeff<-NULL
P_values<-NULL
for(e in 1:39){   #44 years total for each country
      paneldata<-pdata.frame(
rbind(
subset(LaggedPannel,Country=="A")[(e):(e+5),],
subset(LaggedPannel,Country=="B")[(e):(e+5),]),
index=c("Country","Year")) #we made our new windowed panel frame


coef<-coef(summary(plm(Y~lag(Y,1),data=paneldata,model="pooling")))[2,1] #gets the coeff from a panel regression
PV<-coef(summary(plm(Y~lag(Y,1),data=paneldata,model="pooling")))[2,4] #stores the p-values
coeff<-c(coeff,coef)
P_values<-c(P_values,PV)
    } 
plot(coeff,type="b",col="red") #previousplot

Before

 plot(coeff,col=ifelse(P_values<=0.05, "blue", "red"),ylab = "coef",type="b") 
    #new plot based on significant values:

After

Єдина проблема з цією відповіддю полягає в тому, що вона досить трудна, якщо ви маєте більше, ніж кілька змінних, які потрібно розглянути; тоді потрібно створити більше, ніж кілька порожніх векторів і так далі. Це не швидкий підхід, але, звичайно, він працює.

1
додано