¿Cómo encontrar datos de panel equilibradas en I (también conocido como, cómo encontrar las entradas que están en el panel completo sobre determinada ventana)
Pregunta
Tengo un gran panel de los datos de Compustat. Para que estoy añadiendo algunos datos recogidos a mano (en serio a mano recogidos de una pila de libros antiguos). Pero no quiero a mano para recoger todo el panel, sólo un subconjunto seleccionado de forma aleatoria. Para encontrar el conjunto más grande (de la que estoy seleccionando al azar) Me gustaría comenzar con el panel balanceado de Compustat.
Veo la biblioteca plm
para trabajar con paneles desequilibrados, pero me gustaría mantener el equilibrio. ¿Hay una manera limpia de hacer este corto de buscar y tirar de las empresas (personas físicas) en panelspeak que no se ejecutan el período de la muestra? Gracias!
Solución
Después de un segundo pensamiento, hay una manera mucho más fácil para hacer esto.
vistazo a esto:
data.with.only.complete.subjects.data <- function(xx, subject.column, number.of.observation.a.subject.should.have)
{
subjects <- xx[,subject.column]
num.of.observations.per.subject <- table(subjects)
subjects.to.keep <- names(num.of.observations.per.subject)[num.of.observations.per.subject == number.of.observation.a.subject.should.have]
subset.by.me <- subjects %in% subjects.to.keep
new.xx <- xx[subset.by.me ,]
return(new.xx)
}
xx <- data.frame(subject = rep(1:4, each = 3),
observation.per.subject = rep(rep(1:3), 4))
xx.mis <- xx[-c(2,5),]
data.with.only.complete.subjects.data(xx.mis , 1, 3)
Otros consejos
Mirándolo ahora, que pierde el formato de algunos de los datos, pero puede darse cuenta de eso después. Aquí está mi intento de tomar la parte equilibrada del panel:
> data <- read.csv("223601533.csv")
> head(data)
gvkey indfmt datafmt consol popsrc fyear fyr datadate exchg isin
1 2721 INDL HIST_STD C I 2000 12 20001231 264 JP3242800005
2 2721 INDL HIST_STD C I 2001 12 20011231 264 JP3242800005
3 2721 INDL HIST_STD C I 2002 12 20021231 264 JP3242800005
4 2721 INDL HIST_STD C I 2003 12 20031231 264 JP3242800005
5 2721 INDL HIST_STD C I 2004 12 20041231 264 JP3242800005
6 2721 INDL HIST_STD C I 2005 12 20051231 264 JP3242800005
sedol conm costat fic
1 6172323 CANON INC A JPN
2 6172323 CANON INC A JPN
3 6172323 CANON INC A JPN
4 6172323 CANON INC A JPN
5 6172323 CANON INC A JPN
6 6172323 CANON INC A JPN
>
> obs.all <- tabulate(data$gvkey) # incl lots of zeros for unused gvkey
> num.obs <- tabulate(obs.all)
> mode.num.obs <- which(num.obs == max(num.obs))
> nt.bal <- num.obs[mode.num.obs] * mode.num.obs
> pot.obs <- which(obs.all == mode.num.obs)
> data.bal <- as.data.frame(matrix(NA, nrow=nt.bal, ncol=ncol(data)))
> colnames(data.bal) <- colnames(data)
>
> for(i in 1:length(pot.obs)) {
+ last.row <- i * mode.num.obs
+ first.row <- last.row - (mode.num.obs - 1)
+ data.bal[first.row:last.row, ] <- subset(data, gvkey == pot.obs[i])
+ }
>
> head(data.bal)
gvkey indfmt datafmt consol popsrc fyear fyr datadate exchg isin sedol conm
1 2721 2 1 1 1 2000 12 20001231 264 875 359 331
2 2721 2 1 1 1 2001 12 20011231 264 875 359 331
3 2721 2 1 1 1 2002 12 20021231 264 875 359 331
4 2721 2 1 1 1 2003 12 20031231 264 875 359 331
5 2721 2 1 1 1 2004 12 20041231 264 875 359 331
6 2721 2 1 1 1 2005 12 20051231 264 875 359 331
costat fic
1 1 1
2 1 1
3 1 1
4 1 1
5 1 1
6 1 1
>
Actualización: Creo que esta solución es menos bueno, entonces el otro que he publicado anteriormente, pero estoy dejándolo como un ejemplo de una solución - que no es tan bueno :) *
Hola Rishard,
Es un poco difícil con algunos datos de muestra para ayudarle.
Pero suena como que podría formar de nuevo sus datos usando "fundir" y "fundido" del paquete de "remodelar". Haciendo que le permitirá encontrar donde se tiene muy pocos observación por sujeto, y luego usar esa información para un subconjunto de sus datos.
Aquí hay un código de ejemplo de cómo se puede hacer esto:
xx <- data.frame(subject = rep(1:4, each = 3),
observation.per.subject = rep(rep(1:3), 4))
xx.mis <- xx[-c(2,5),]
require(reshape)
num.of.obs.per.subject <- cast(xx.mis, subject ~.)
the.number <- num.of.obs.per.subject[,2]
subjects.to.keep <- num.of.obs.per.subject[,1] [the.number == 3]
ss.index.of.who.to.keep <- xx.mis $subject %in% subjects.to.keep
xx.to.work.with <- xx.mis[ss.index.of.who.to.keep ,]
xx.to.work.with
Saludos,
Tal
> # read data
> file.in <- "243815928.csv"
> data <- read.csv(file.in)
>
> # find which gvkeys run the entire sample period
> obs.all <- tabulate(data$gvkey) # incl lots of zeros for unused gvkey
> num.obs <- tabulate(obs.all)
> mode.num.obs <- which(num.obs == max(num.obs))
> nt.bal <- num.obs[mode.num.obs] * mode.num.obs
> pot.obs <- which(obs.all == mode.num.obs)
>
> # create new df w/o firms that don't run the whole sample period
> pot.obs.index <- which(data$gvkey %in% pot.obs)
> data.bal <- data[pot.obs.index, ]
>
> # write data to csv file
> file.out <- paste(substr(file.in, 1, (nchar(file.in)-4)), "sorted.csv", sep="")
> write.csv(data.bal, file.out)