当前位置: 首页 > 知识库问答 >
问题:

R中的AIC:使用加权数据时,手工值与内部值的差异

贲宜春
2023-03-14

我正在尝试使用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

共有1个答案

养焱
2023-03-14

您看到的差异是由于在手工计算加权模型时使用了未加权的对数似然公式。例如,可以通过以下调整复制M2M4AI结果:

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

  • “Kubernetes”(v1.10.2)说我的pod(包含一个容器)使用了大约5GB的内存。在容器内部,RSS更像是681MIB。anypony能否解释如何使用以下数据从681MIB到5GB(或者描述如何使用我省略的另一个命令来弥补差异,或者来自容器,或者来自在kubernetes中运行该容器的docker主机)? kubectl top pods显示为5GB: Cadvisor报告了一个相似的