Вложение отсутствующих наблюдений со средним рядом для панельных данных в R - PullRequest
0 голосов
/ 11 января 2020

У меня есть данные панели, которые содержат некоторые пропущенные значения для ряда переменных. Я хочу приписать недостающие данные среднему значению для панельных данных. Я попытался использовать следующий код, но я не знаю, как попросить r выполнить вычисление с учетом года и идентификатора или страны.

Следующий код является пробным для вменения отсутствующего значения для одна переменная. ** Моя цель - сделать этот шаг для всех переменных.

my_data$V1[is.na(my_data$V1)] <- mean(my_data$V1,na.rm = TRUE)

head (my_data)

year   id    V1    V2
2000   AA         
2001   AA         
2002   AA    2     2
2003   AA    3     3
2000   BB    4     4
2001   BB         
2002   BB    3     3
2003   BB        
2000   CC    2     2     
2001   CC    3     
2002   CC    3     3       
2003   CC         
2000   DD          4
2001   DD          2
2002   DD          
2003   DD          

Как мне справиться с отсутствующим значением, рассчитав среднее значение для отсутствующих значений?

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

Спасибо.

Ответы [ 4 ]

2 голосов
/ 11 января 2020

Вот базовое решение R

my_data$V1<-ave(my_data$V1,my_data$id,FUN=function(x) ifelse(is.na(x), mean(x,na.rm=TRUE), x))

Это для применения его ко всем столбцам.

for (i in 3:ncol(my_data)){
  my_data[,i] <- ave(my_data[[i]],my_data$id,FUN=function(x) ifelse(is.na(x), mean(x,na.rm=TRUE), x))}

Это решение без использования l oop

my_data[, 3:ncol(my_data)] = apply(my_data[, 3:ncol(my_data)], 2, function(x) ifelse(is.na(x), mean(x,na.rm=TRUE), x))
2 голосов
/ 11 января 2020

Это можно сделать с помощью пакета dplyr.

my_data <- tibble::tribble(
  ~year, ~id, ~V1, ~V2,
  2000,  "AA", NA,  NA,   
  2001,  "AA", NA,  NA,           
  2002,  "AA",  2,   2,
  2003,  "AA",  3,   3,
  2000,  "BB",  4,   4,
  2001,  "BB", NA,  NA,       
  2002,  "BB",  3,   3,
  2003,  "BB", NA,  NA,        
  2000,  "CC",  2,   2,     
  2001,  "CC",  3,  NA,    
  2002,  "CC",  3,   3,       
  2003,  "CC",  NA, NA,       
  2000,  "DD",  NA,  4,
  2001,  "DD",  NA,  2,
  2002,  "DD",  NA,  NA,   
  2003,  "DD",  NA,  NA  
)

library(dplyr)
my_data <- my_data %>% group_by(year, id) %>% mutate(avg = mean(V1, na.rm=T))
my_data$V1[is.na(my_data$V1)] <- my_data$avg[is.na(my_data$V1)]
0 голосов
/ 11 января 2020

Применение функции к столбцу может быть легко сделано с помощью data.table.

library(data.table)
######creating dummy data
data=data.table(expand.grid(year=2000:2003,id=c("AA","BB","CC","DD")),
                V1=sample(c(2:4,NA),16,replace = T),
                V2=sample(c(2:4,NA),16,replace = T))


impute=function(x){
  x[is.na(x)]=mean(x,na.rm = T)
  return(x)
}
data[,lapply(.SD,impute),by=c("id")]
0 голосов
/ 11 января 2020

В этом коде вы перебираете все идентификаторы и все столбцы, заменяя значения NA на правильные средние значения для каждого идентификатора.

for(id in unique(matriz$id))
{
  for(i in 3:ncol(matriz))
  {
    my_data[is.na(my_data[,i]),i] <- mean(my_data[which(my_data$id == id & my_data$year <= '2003'),i],na.rm = TRUE)
  }
}

Поскольку ваши данные начинаются в 2000 году, я не добавил условие my_data$year >= '2000', если у вас есть годы до 2000, просто добавьте его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...