我正在尝试建模一些数据.我的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
Run Code Online (Sandbox Code Playgroud)
有没有办法使用lm或glm做一个能产生合理拦截和alpha的功率曲线?
似乎Excel可能在日志范围内执行具有正常错误的线性模型 - 我将Excel结果与您在建立日志时x和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
Run Code Online (Sandbox Code Playgroud)
这当然有效,因为如果
y = a * x ^ b
log(y) = log(a) + b * log(x)
Run Code Online (Sandbox Code Playgroud)
因此,线性模型的拟合系数log(a),并b在功率模型.
不同之处在于误差分布的假设.使用NLS的另一个答案是最小化功率标度上的平方误差 - 如果您假设正常分布的误差,则为MLE y.这种方法(显然也是Excel的方法)假设错误在对数刻度上是正常的,这意味着在未转换的量表上假设对数正态误差 - 这可能更合适.(虽然从eipi的答案中可以看出,拟合值的差异非常小.)
我没有使用过该poweRlaw软件包,但是R的基础nls(非线性最小二乘)函数给出了与Excel相似的结果.如果有差异,在检查我的代码错误之后,我的第一个想法是"对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)
Run Code Online (Sandbox Code Playgroud)