如何根据R中另一个数据集的分布对数据进行采样

时间:2017-01-05 21:43:48

标签: r sampling kernel-density

我想根据R中较小数据集的分布对大型数据集进行采样。我一直在寻找解决方案但没有成功。我在R中比较新,所以如果这很简单,我会道歉。但是,我尝试了一些solutions

以下是一些示例数据。我称之为观察和模型:

# Set seed
set.seed(2)

# Create smaller observed data
Obs <- rnorm(1000, 5, 2.5)

# Create larger modeled data
set.seed(2)
Model <- rnorm(10000, 8, 1.5)

两个数据集的分布如下: enter image description here

目标:我想品尝较大的&#34;型号&#34;数据集以匹配较小的&#34;观察到的#34;。我知道有不同的数据点,所以它不会直接匹配。

我一直在阅读density()sample(),其中我会执行以下操作:

# Obtain the density of the observed at the length of the model.
# Note: info on the sample() function stated the prob argument in the sample() function 
# must be the same length as what's being sampled. Thus, n=length(Model) below.

dens.obs <- density(Obs, n=length(Model))

# Sample the Model data the length(Obs) at the probability of density of the observed
set.seed(22)
SampleMod <- sample(Model, length(Obs), replace=FALSE, prob=dens.obs$y)

这给了我一个看起来与旧的非常相似的新情节(除了尾巴): enter image description here

我希望能有更好的比赛。因此,我开始探索在模型数据上使用密度函数。见下文:

# Density function on model, length of model
dens.mod <- density(Model, n=length(Model))

# Sample the density of the model $x at the density of the observed $ y
set.seed(22)
SampleMod3 <- sample(dens.mod$x, length(Obs), replace=FALSE, prob=dens.obs$y)

这是两个图,第一个与第一个采样相同,第二个是第二个采样: enter image description here

右图中有一个更理想的偏移,它表示由观察密度建模的采样密度。但是,数据并不相同。也就是说,我没有对Modeled数据进行采样。见下文:

summary(SampleMod3 %in% Model)

产生

   Mode   FALSE    NA's 
logical    1000       0 

表示我没有对建模数据进行采样,而是对建模数据的密度进行采样。是否可以根据另一个数据集的分布对数据集进行采样?提前谢谢。

修改

感谢所有帮助人员!这是我使用danielson提供的approxfun()函数并使用bethanyp支持的情节。

enter image description here

有什么帮助理解为什么这个时髦的新发行版?

2 个答案:

答案 0 :(得分:2)

有趣的问题。我认为这会有所帮助。首先,它近似于密度函数。然后,它从模型点采样拟合密度的概率。

predict_density = approxfun(dens.obs) #function that approximates dens.obs
#sample points from Model with probability distr. of dens.obs
SampleMod3 <- sample(Model, length(Obs), replace=FALSE, prob=predict_density(Model))
summary(SampleMod3 %in% Model)
   Mode    TRUE    NA's 
logical    1000       0 

答案 1 :(得分:1)

我认为在实践中你使用的是一组真实的非随机生成数据。在这种情况下,不同样本的可能值具有上升的概率,因为随机抽样方法并不意味着数据中没有模式。在荒野中,真实的东西有真实的频率,这将在您的元样本中显示。

因此,您应该使用加权概率从原始样本中选择较小的子样本。

整个人口的例子{1,2,1,3,4,1,3} 绘制每个数字的概率(记住总和必须等于1): 1:.4285 2:.1429 3:.2857 4:.1429

如果您在

prob= my_freqs部分使用这些加权概率
sample(x, size, replace = FALSE, prob = my_freqs)

您可能会获得更符合您预期的概率。但我不能100%确定这是你所追求的。

在随机数据中,尝试set.seed(2)并查看是否告诉R使用用于在原始集创建中生成这些频率的种子,让您更接近目标。

我知道每组都有一个通用的随机公式。我不得不假设它是一组为各种随机方法生成它们的方法的频率概率,所以它可以帮助你在从随机集合中采样之前使用它。