在频率表上运行统计数据,就好像它是 R 中的完整数据集一样

oct*_*ern 5 r

我对两个值进行了数十亿次测量,x并且y. 这太大而无法对原始数据进行操作,因此我将它们表示为频率表。对于每个唯一的x值和y值组合,我都有一行,还有一个变量freq显示有多少数据点具有该值的组合。

如果我想估计x和y之间的关系,我可以这样做:lm(y ~ x, data=df, weights=df$freq)。我已经对此进行了测试,它给出了准确的参数估计,但给出了错误的t值。它仍然将每一行视为一个观察,因此自由度比它们应该的要小得多。

  • 有没有办法运行将每一行视为适当数量的记录的分析?
  • 是否有通用工具可以让 R 像原始数据集一样对频率表进行操作?

注意:这个问题显示了如何重新创建原始数据,但我的原始数据非常大,这就是我首先使用频率表的原因。

例子

# This dataset has a negative correlation between x and y:
library(dplyr) 
raw_data<-data.frame(
  x=rep(c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4), 100),
  y=rep(c(5,5,5,5,1,4,4,4,4,1,3,3,3,3,7,2,2,2,2,8), 100)
)

lm_raw<-lm(x ~ y, data=raw_data)
summary(lm_raw)[c("coefficients", "df")]

# Let's say instead I have a have a summary dataset that has the frequency for each x-y pair:

freq_data <- raw_data %>% group_by(x,y) %>% summarise(freq=n())

# Analyze and weight by frequency. Parameter estimates are right but the t value is wrong:

lm_freq<-lm(x ~ y, data=summh, weights=summh$freq)
summary(lm_freq)$coefficients   

# ... because it's treating this as 8 data points instead of thousands

summary(lm_freq)$df
Run Code Online (Sandbox Code Playgroud)

小智 0

您可以手动调整自由度:

lm_freq$df.residual <- with(lm_freq, sum(weights) - length(coefficients))
Run Code Online (Sandbox Code Playgroud)

现在您应该获得正确的 t 值。我参考了这篇文章