我正在尝试建模一些数据.我的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
有没有办法使用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
这当然有效,因为如果
y = a * x ^ b log(y) = log(a) + b * log(x)
因此,线性模型的拟合系数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)