Excel 中的幂律比 R 更有效?

Power Law in Excel works better than R?

我正在尝试对一些数据建模。我在 Excel 方面的运气比 R 好,但是 Excel 解决方案无法扩展,所以我需要弄清楚如何在 R 中做到这一点。

Excel 会将趋势线映射到数据,幂曲线会产生合理的 y = 0.6462x^-0.542。

当我将相同的数据放入 R 并尝试使用 poweRlaw 包中的连续幂律对其进行建模时,我得到类似 y = 0.14901x^-3.03671 的结果。截距太小,alpha 太大。

# 14 days of % of users retained
y = c(0.61431   , 0.42585   , 0.35427   , 0.33893   , 0.28853   , 0.26004   , 0.2352    , 0.20087   , 0.17969   , 0.1848    , 0.17311   , 0.17092   , 0.15777   , 0.14901)

y.pl = conpl$new(y)
y.pl_est = estimate_xmin(c_pl)
y.pl_est

# $KS
# 0.1068587
#
# $xmin
# 0.14901
#
# $pars
# 3.03673
#
# $ntail
# 14

有没有一种方法可以使用 lmglm 来绘制功率曲线以提供合理的截距和 alpha?

我没有使用过 poweRlaw 包,但是 R 的基础 nls(non-linear 最小二乘)函数给出的结果与您使用 Excel 得到的结果相似。如果有差异,在检查我的代码是否有错误后,我的第一个想法是 "so much the worse for Excel" :).

# Data
dat = data.frame(x=1:14,
y = c(0.61431   , 0.42585   , 0.35427   , 0.33893   , 0.28853   , 0.26004   , 0.2352    , 0.20087   , 0.17969   , 0.1848    , 0.17311   , 0.17092   , 0.15777   , 0.14901))

# Model
m1 = nls(y ~ a*x^b, list(a=1,b=1), data=dat)
summary(m1)

Formula: y ~ a * x^b

Parameters:
  Estimate Std. Error t value Pr(>|t|)    
  a  0.62104    0.01307   47.51 4.94e-15 ***
  b -0.51460    0.01525  -33.74 2.92e-13 ***

# Plot nls model
curve(coef(m1)[1]*x^coef(m1)[2], from=1, to=14)

# Add curve for Excel model in red
curve(0.6462*x^(-0.542), from=1, to=14, col="red", lty=2, add=TRUE)

# Add data points
points(dat$x, dat$y)

似乎 Excel 可能正在做一个线性模型,在对数尺度上有正常误差 - 我将 Excel 结果匹配到与你分享的一样多的小数位12=] 和 y 建模前。

使用@eipi10 共享的数据框:

dat = transform(dat, logx = log(x), logy = log(y))
mod = lm(logy ~ logx, data = dat)

## intercept
exp(coef(mod)[1])
# (Intercept) 
#   0.6461621 

## power
coef(mod)[2]
#       logx 
# -0.5424412 

这当然有效,因为如果

      y = a * x ^ b
 log(y) = log(a) + b * log(x)

所以线性模型的拟合系数在幂模型中是log(a)b

区别在于误差分布的假设。使用 NLS 的另一个答案最小化功率标度上的平方误差 - 如果您假设 y 中的正态分布误差,则为 MLE。这种方法(显然 Excel 的方法也是如此)假设错误在对数尺度上是正常的,这意味着假设 log-normal 错误在未转换的尺度上 - 这可能更合适。 (虽然从eipi的回答中的图表我们可以看出拟合值的差异很小。)