【问题标题】:Function in a loop over dataset数据集循环中的函数
【发布时间】: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,我猜你需要的是通过YearAge 标准合并数据集nz。结果集将包含包含年龄、死亡和风险的列,并且保证它们的长度相同。然后,您可以将结果数据集按Year 分组并应用minusgompakll1 函数。如果这听起来像是一个正确的策略,我可以帮助编写代码。
  • @MaratTalipov 我现在制作了一个新的数据集“df”,其中包含“n”、“z”、Year 和 Age。我现在如何按年份对结果数据进行分组?问题是,对于每一年(比如 1940 年),我都需要一个年龄(18-100)的向量,一个“n”的向量(包含每个年龄的估计值),对于死亡也是如此。因此,minusgompakll1 函数中的每次迭代都会收到 3 个向量,每个向量的大小为 83。然后这样做一年,我需要继续下一个,这将再次有 3 个大小为 83 的向量(大小为 83,因为年龄 18 -100 是 83 个估计值)。谢谢
  • 年龄列从 18 到 100 岁,然后从 18 岁开始新的一年

标签: r function loops


【解决方案1】:

我认为这可能是解决方案:

设置

set.seed(1)

# Make a sample data set with risks. For simplicity, we assume there are no NAs
risk <- expand.grid(Age=18:100,Year=1940:1979)
risk$Female <- runif(nrow(risk),min=20000,max=30000)
risk$Male <- runif(nrow(risk),min=20000,max=30000)
risk$Total <- with(risk,Female+Male)

# Make a sample data set with number of deaths For simplicity, we assume there are no NAs
deaths <- expand.grid(Age=18:100,Year=1940:1979)
deaths$Female <- runif(nrow(deaths),min=1000,max=2000)
deaths$Male <- runif(nrow(deaths),min=1000,max=2000)
deaths$Total <- with(deaths,Female+Male)

# Merge risks and deaths
d <- merge(risk,deaths,by=c('Year','Age'),suffixes=c('.risk','.death'))

s <- -c(8,9,2)

实际代码

library(dplyr)

# Apply the function for the data set grouped by year
d %>% 
  group_by(Year) %>% 
  summarise(likelihood=minusgompakll1(s,Age,Male.risk,Male.death))

输出

#    Year likelihood
# 1  1940   17165333
# 2  1941   18402227
# 3  1942   16660317
# 4  1943   18288280
# 5  1944   18004813
# 6  1945   16669699
# 7  1946   16531964
# 8  1947   18000839
# 9  1948   16945135
# ...

【讨论】:

  • 这是一个很好的设置,谢谢!我试图安装包dplyr,找不到?那里写的“%>%”是什么?
  • 你是用 R 中的install.packages('dplyr') 做的吗? Re: %>% -- 这是一种将dplyr 中的多个操作链接在一起的方法。来自官方文档:“这些函数通过简单的替换工作,因此x %.% f(y) 被翻译成f(x, y)
  • 是的,这个包现在可以工作了,谢谢! :) 但是我仍然遇到 %>% 输入的问题,我收到一条错误消息: df%>% group_by(Year) %>% summarise(likelihood=minusgompakll1(s,age,Male.risk,Male.death))错误:找不到函数“%>%”
  • 只是为了确保 -- 你没有忘记加载包 (library(dplyr)),对吗?
  • 啊,终于成功了!好像我有一个旧版本的 R,它不包括那个包。通过更新 R,它终于奏效了!谢谢马拉! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
相关资源
最近更新 更多