我有一个来自网络讨论论坛的统计数据集。我正在查看一个主题期望得到的答复数量的分布。特别是,我创建了一个数据集,该数据集包含主题答复计数列表,然后包含具有该答复数目的主题计数。
"num_replies","count"
0,627568
1,156371
2,151670
3,79094
4,59473
5,39895
6,30947
7,23329
8,18726
如果我将数据集绘制在对数-对数图上,那么我得到的基本上是一条直线:
(这是一个Zipfian分布)。Wikipedia告诉我,对数对数图上的直线表示可以用形式的单项式建模的函数。实际上,我已经关注了这样的功能:
lines(data$num_replies, 480000 * data$num_replies ^ -1.62, col="green")
我的眼球显然不如R准确。那么如何使R更精确地适合我的模型参数呢?我尝试了多项式回归,但是我不认为R试图将指数作为参数拟合-我想要的模型的专有名称是什么?
编辑:谢谢大家的回答。如建议的那样,我现在使用以下配方针对输入数据的日志拟合线性模型:
data <- read.csv(file="result.txt")
# Avoid taking the log of zero:
data$num_replies = data$num_replies + 1
plot(data$num_replies, data$count, log="xy", cex=0.8)
# Fit just the first 100 points in the series:
model <- lm(log(data$count[1:100]) ~ log(data$num_replies[1:100]))
points(data$num_replies, round(exp(coef(model)[1] + coef(model)[2] * log(data$num_replies))),
col="red")
结果是这样,以红色显示模型:
就我的目的而言,这似乎是一个很好的近似值。
然后,如果我使用此Zipfian模型(alpha = 1.703164)以及随机数生成器生成与包含的原始测量数据集相同的主题总数(1400930)(使用我在网上找到的C代码),则结果看起来喜欢:
测量点为黑色,根据模型随机生成的点为红色。
我认为这表明通过随机生成这1400930个点而创建的简单方差很好地解释了原始图形的形状。
如果您有兴趣自己玩原始数据,请在此处发布。