我想根据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)
目标:我想品尝较大的&#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)
我希望能有更好的比赛。因此,我开始探索在模型数据上使用密度函数。见下文:
# 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)
右图中有一个更理想的偏移,它表示由观察密度建模的采样密度。但是,数据并不相同。也就是说,我没有对Modeled数据进行采样。见下文:
summary(SampleMod3 %in% Model)
产生
Mode FALSE NA's
logical 1000 0
表示我没有对建模数据进行采样,而是对建模数据的密度进行采样。是否可以根据另一个数据集的分布对数据集进行采样?提前谢谢。
修改
感谢所有帮助人员!这是我使用danielson提供的approxfun()
函数并使用bethanyp支持的情节。
有什么帮助理解为什么这个时髦的新发行版?
答案 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使用用于在原始集创建中生成这些频率的种子,让您更接近目标。
我知道每组都有一个通用的随机公式。我不得不假设它是一组为各种随机方法生成它们的方法的频率概率,所以它可以帮助你在从随机集合中采样之前使用它。