Excel中的幂律比R好吗?

时间:2016-01-05 23:28:42

标签: r modeling

我正在尝试为一些数据建模。我的Excel运气比R好,但Excel解决方案不会缩放,所以我需要在R中计算出如何做到这一点。

Excel会将趋势线映射到数据,而Power曲线会产生合理的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

Image shows how the models built from 14-days of data with Excel and R conpl() match up to the Actuals out to day 60

有没有办法使用lmglm来做一个能产生合理拦截和alpha的功效曲线?

2 个答案:

答案 0 :(得分:8)

似乎Excel可能会在日志范围内执行具有正常错误的线性模型 - 我将Excel结果与您在使用xy日志时共享的小数位数相匹配建模。

使用@ 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的方法)假设错误在对数刻度上是正常的,这意味着在未转换的量表上假设对数正态误差 - 这可能更合适。 (尽管从eipi的答案中可以看出,拟合值的差异非常小。)

答案 1 :(得分:6)

我还没有使用poweRlaw软件包,但R的基本nls(非线性最小二乘)函数给出了与Excel相似的结果。如果存在差异,在检查我的代码是否有错误之后,我的第一个想法就是#34;这对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)

enter image description here