R中的蒙特卡洛模拟的加权随机抽样

时间:2019-06-29 12:34:06

标签: r random sample montecarlo weighted

我想进行蒙特卡洛模拟。我有一个data.frame,其中行是唯一的ID,具有与列之一关联的可能性。可以将输入列中的数据视为该概率的权重。我想根据每一行列出的权重随机sample中的每一行data.frame。每行每次运行应仅返回一个值。 data.frame结构如下:

ID,    X2000,  X2001,  X2002,  X2003,  X2004
X11,   0,      0,      0.5,    0.5,    0
X33,   0.25,   0.25,   0.25,   0.25,   0
X55,   0,      0,      0,      0,      1
X77,   0.5,    0,      0,      0,      0.5

对于权重,“ X11”应返回X2002或X2003,“ X33”应具有相等的返回X2000,X2001,X2002或X2003的概率,并且应该相等,而没有返回X2004的机会。 “ X55”的唯一可能的返回值应该是X2004。

我感兴趣的输出数据是该运行所采样的ID和列,尽管返回如下所示的内容可能更简单:

ID,    X2000,  X2001,  X2002,  X2003,  X2004
X11,   0,      0,      1,      0,      0
X33,   1,      0,      0,      0,      0
X55,   0,      0,      0,      0,      1
X77,   1,      0,      0,      0,      0

1 个答案:

答案 0 :(得分:1)

您的data.frame已转置-sample()函数采用概率向量。但是,您的概率向量是按行排列的,这意味着要从data.frame中提取数据更加困难。

要解决此问题-您可以将ID列作为row.name导入。这使您能够在apply()语句期间访问它。请注意,apply()会将data.frame强制转换为矩阵,这意味着仅允许一种数据类型。这就是为什么ID必须是行名的原因-否则我们将使用字符而不是数字的概率矢量。

mc_df <- read.table(
text = 
'ID    X2000  X2001  X2002  X2003  X2004
X11   0      0      0.5    0.5    0
X33   0.25   0.25   0.25   0.25   0
X55   0      0      0      0      1
X77   0.5    0      0      0      0.5'
                    , header = T
                    ,row.names = 1)

从那里可以使用apply函数:

apply(mc_df, 1, function(x) sample(names(x), size = 200, replace = T, prob = x))

或者您也可以幻想

apply(mc_df, 1, function(x) table(sample(names(x), size = 200, replace = T, prob = x)))

$X11

X2002 X2003 
  102    98 

$X33

X2000 X2001 X2002 X2003 
   54    47    64    35 

$X55

X2004 
  200 

$X77

X2000 X2004 
  103    97 

Fancier:

apply(mc_df, 1, function(x) table(sample(as.factor(names(x)), size = 200, replace = T, prob = x)))
      X11 X33 X55 X77
X2000   0  51   0  99
X2001   0  50   0   0
X2002  91  57   0   0
X2003 109  42   0   0
X2004   0   0 200 101

或更奇特的

prop.table(apply(mc_df
                 , 1
                 , function(x) table(sample(as.factor(names(x)), size = 200, replace = T, prob = x)))
           ,2)
       X11   X33 X55   X77
X2000 0.00 0.270   0 0.515
X2001 0.00 0.235   0 0.000
X2002 0.51 0.320   0 0.000
X2003 0.49 0.175   0 0.000
X2004 0.00 0.000   1 0.485