我正在尝试使用R作为模型选择的基础上的AIC统计。在比较有权重或无权重的线性模型时,我在R中的代码通知我,与无权重相比,有权重更可取,这些结果在其他软件(GraphPad Prism)中得到了证实。我有使用标准曲线中真实数据的示例代码:
#Linear Curve Fitting
a <- c(0.137, 0.412, 1.23, 3.7, 11.1 ,33.3)
b <- c(0.00198, 0.00359, 0.00816, 0.0220, 0.0582, 0.184)
m1 <- lm(b ~ poly(a,1))
m2 <- lm(b ~ poly(a,1), weight=1/a)
n1 <- 6 #Number of observations
k1 <- 2 #Number of parameters
当我使用R中的内部函数或通过手工计算来计算AIC时,其中:
AIC=n+nlog2?+nlog(RSS/n)+2(k+1),具有n个观测值和k个参数
> AIC(m1); n1+(n1*log(2*pi))+n1*(log(deviance(m1)/n1))+(2*(k1+1))
[1] -54.83171
[1] -54.83171
> AIC(m2); n1+(n1*log(2*pi))+n1*(log(deviance(m2)/n1))+(2*(k1+1))
[1] -64.57691
[1] -69.13025
c <- c(0.5, 1, 5, 10, 30, 100, 300)
d <- c(3, 5, 20, 50, 75, 200, 250)
m3 <- nls(d ~ (V * c)/(K + c), start=list(V=10, K=1))
m4 <- nls(d ~ (V * c)/(K + c), start=list(V=10, K=1), weight=1/d^2)
n2 <- 7
k2 <- 2
> AIC(m3); n2+(n2*log(2*pi))+n2*(log(deviance(m3)/n2))+(2*(k2+1))
[1] 58.48839
[1] 58.48839
> AIC(m4); n2+(n2*log(2*pi))+n2*(log(deviance(m4)/n2))+(2*(k2+1))
[1] 320.7105
[1] 0.1538546
您看到的差异是由于在手工计算加权模型时使用了未加权的对数似然公式。例如,可以通过以下调整复制M2
和M4
的AI
结果:
在m2
的情况下,您只需将sum(log(M2$weights))
从您的计算中分出来:
AIC(m2); n1+(n1*log(2*pi))+n1*(log(deviance(m2)/n1))+(2*(k1+1)) - sum(log(m2$weights))
[1] -64.57691
[1] -64.57691
在m4
的情况下,您必须将deviance
调用与加权残数计算交换,并从结果中减去n2*sum(log(M4$weights))
:
AIC(m4); n2+(n2*log(2*pi))+n2*(log(sum(m4$weights * m4$m$resid()^2)/n2))+(2*(k2+1)) - n2 * sum(log(m4$weights))
[1] 320.7105
[1] 320.7105
我用AIC比较了两个模型。但是,我意识到两个AIC值都太小了(-4752.66,另一个接近于那个)。我想知道这是正常的还是我在计算的时候做错了什么。
矩阵误差(均值(范围),ncol=ncol(x),nrow=nrow(x),dimnames=dimnames(x)):非数值矩阵范围 然而,我记得几个月前曾看到过其他案例,其中arulesViz库是以类别数据类型工作的。
我正在尝试计算多个列的中值,但是我的数据有点奇怪。它看起来像下面的示例。 在表中到列表示该值的出现次数。我想计算中位数的出现次数。 例如对于ID = 1 是我想要创建的计算。 对于ID=2 我尝试过使用<code>rep()或<code>rep(10,2)),这就是我所期望的。我只是努力创建一个列表或向量,每个列都有重复。
本文向大家介绍如何找到R数据帧中所有值的均值?,包括了如何找到R数据帧中所有值的均值?的使用技巧和注意事项,需要的朋友参考一下 如果数据框具有所有数字列,那么我们可能有兴趣查找该数据框中所有值的均值,但是由于数据框对象不是数字,因此无法直接完成此操作。因此,要查找R数据帧中所有值的均值,我们需要先将其转换为矩阵,然后使用均值函数。 示例 请看以下数据帧- 输出结果 使用均值函数查找均值- 示例 输
问题内容: 我有下表。我想根据以下公式计算按每个日期分组的加权平均值。我可以使用一些标准的常规代码来执行此操作,但是假设此数据在pandas数据框中,是否有比通过迭代更简单的方法来实现此目的? 2012年1月1日w_avg = 0.5 (60 / sum(60,80,100))+ .75 (80 / sum(60,80,100))+ 1.0 *(100 / sum(60,80,100)) 2012
问题内容: 很快,我将不得不准备几天内的物品价格清单。粒度为1天,在有商品销售的日子里,我将平均价格以获取当天的平均价格。有时候会没有销售,因此我很适合通过拉前一次和下一次销售来使用足够的近似值,并且在它们之间的每一天,其价格都从一个线性变化到另一个线性变化。 想象一下原始数据是: 我可以到这里: 我想去的地方是: 到目前为止,我尝试了什么?仅思考;我正计划做类似的事情: 拉取原始数据 加入数字/