用序列平均值对R中的面板数据估算缺失的观测值

时间:2020-01-11 14:57:12

标签: r

我有一个面板数据,其中包含一些缺少一些变量的值。我想用面板平均值的序列均值估算缺失的数据。我尝试使用以下代码,但我不知道如何通过考虑年份和ID或国家/地区要求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 个答案:

答案 0 :(得分:2)

这可以在软件包package dto; import java.io.Serializable; public class ClientDTO implements Serializable { private final int id; private final String name; private final String username; private final String password; public ClientDTO(int id, String name, String username, String password){ this.id = id; this.name = name; this.username = username; this.password = password; } public int getId(){ return id; } public String getName(){ return name; } public String getUsername(){ return username; } public boolean passwordMatches(String pwd){ return password.equals(pwd); } } package dto; import java.io.Serializable; import java.util.Calendar; import javax.inject.Named; @Named(value = "clientOrder") public class clientOrderDTO implements Serializable{ private final int id; private final ClientDTO client; private final String orderName; private Calendar paymentDate; public clientOrderDTO(int id, ClientDTO client, String orderName,Calendar paymentDate){ this.id = id; this.client = client; this.orderName = orderName; this.paymentDate = paymentDate; } public int getId(){ return id; } public ClientDTO getClient(){ return client; } public String getOrderName(){ return orderName; } public Calendar getPaymentDate(){ return paymentDate; } public void setPatmentDate(Calendar paymentDate){ this.paymentDate = paymentDate; } } 的帮助下完成。

dplyr

答案 1 :(得分:2)

这是基本的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))}

这是不使用循环的解决方案

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 :(得分:0)

在此代码中,您遍历所有Id和所有列,将NA值替换为每个Id的正确均值。

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年之前的年份,只需添加它即可。

答案 3 :(得分:0)

使用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")]