【发布时间】:2015-01-19 14:58:43
【问题描述】:
所以我很难让一个函数在几年内工作。 函数如下所示:
minusgompakll1=function(s,ll,n,z)
{
# Computes minus log-likelihood function under the Gomperz-Makeham model.
# Historical data are defined by three equally long vectors "ll", "n" and "z"
# where "ll" defines the age of the individuals, "n" the number of them per
# age and "z" the number of deaths.
#
# Output is minus the log-likelihood function under "s=log(theta)"
# where "theta" is the vector of Gomper-Makeham parameters.
t=exp(s)
p=exp(-t[1]-t[2]*exp(t[3]*ll))
-sum((n-z)*log(p)+z*log(1-p))
}
“s”参数是一个常数,“ll”是一个从 18 到 100(年)的向量,“n”是暴露于风险的个体数量,而“z”是死亡。
现在,在一年内计算这个函数是没有问题的。但是,我的数据集从 1940 年到 1979 年运行,估计每个年龄(18-100 岁)。所以在每一年,比如 1940 年,我们都有 18-100 岁的估计。然后在估计 100 岁之后,数据集继续到 1941 年,再次是 18 岁。预览“n”的样子:
Year Age Female Male Total
18889 1940 18 22096.83 23138.00 45234.83
18890 1940 19 22031.17 23127.33 45158.50
18891 1940 20 21978.83 23120.00 45098.83
18892 1940 21 21967.50 23119.83 45087.33
18893 1940 22 21896.17 23058.83 44955.00
18894 1940 23 21876.17 23011.00 44887.17
18895 1940 24 21774.67 22933.33 44708.00
18896 1940 25 21676.00 22804.33 44480.33
18897 1940 26 21355.83 22550.33 43906.17
18898 1940 27 21346.50 22519.00 43865.50
18899 1940 28 21367.83 22481.50 43849.33
18900 1940 29 21368.33 22490.50 43858.83
18901 1940 30 21390.50 22435.67 43826.17
18902 1940 31 21335.00 22433.00 43768.00
18903 1940 32 21378.00 22476.00 43854.00
18904 1940 33 21401.00 22516.83 43917.83
.
.
23228 1979 28 29775.00 30259.33 60034.33
23229 1979 29 30518.33 31344.00 61862.33
.
.
23299 1979 99 NA NA NA
23300 1979 100 NA NA NA
所以这是一个相当大的数据集。 “z”参数几乎相同,只是男性和女性的死亡人数。我的任务是在所有这些估计中使用该函数,然后例如最后绘制它们。我试过这样的for循环:
X = vector()
for(i in exposure_RISK$Year){
s=-c(8,9,2)
ll = c(18:100)[i]
n = exposure_RISK$Male[i]
z = deaths$Male[i]
X[i] = minusgompakll1(s,ll,n,z)
}
这只给了我包含 1940-1979 年 NA 的数据集。我很确定问题出在“ll”中,它只达到 100,然后不再从 18 岁开始。也许有多个问题?谁能指出问题出在哪里,或者我如何让程序工作?
感谢您的每一个回答!
【问题讨论】:
-
你说
ll应该是一个从 18 到 100 的向量,但在循环中你用i索引它,所以你只会在ll中得到一个数字。您应该在函数调用之前检查ll的值,以确保它符合您的预期(print(ll))。您可能还拥有NA值,因为看起来您在n中缺少值,因此函数内的sum调用将返回NA,除非您设置na.rm=TRUE -
嗯,确实如此。但是“ll”将是一个 18-100 的向量,“n”和“z”将包含函数中每个向量的一个估计值。我需要排列所有三个向量,以便它们都在同一个年龄组中,同时迭代多年,这就是我不明白如何做到这一点@av1:/
-
@Jaz,我猜你需要的是通过
Year和Age标准合并数据集n和z。结果集将包含包含年龄、死亡和风险的列,并且保证它们的长度相同。然后,您可以将结果数据集按Year分组并应用minusgompakll1函数。如果这听起来像是一个正确的策略,我可以帮助编写代码。 -
@MaratTalipov 我现在制作了一个新的数据集“df”,其中包含“n”、“z”、Year 和 Age。我现在如何按年份对结果数据进行分组?问题是,对于每一年(比如 1940 年),我都需要一个年龄(18-100)的向量,一个“n”的向量(包含每个年龄的估计值),对于死亡也是如此。因此,minusgompakll1 函数中的每次迭代都会收到 3 个向量,每个向量的大小为 83。然后这样做一年,我需要继续下一个,这将再次有 3 个大小为 83 的向量(大小为 83,因为年龄 18 -100 是 83 个估计值)。谢谢
-
年龄列从 18 到 100 岁,然后从 18 岁开始新的一年