我正在尝试使用tapply()
函数按几个类别运行模型,但没有太多成功。我的数据有 20 个诊所,我想按每个诊所运行模型。
这是我的模型:
attach(qregdata)
rq(logA~ dose+ chtcm + cage +raceth + sex,tau=.9)
我作为可变诊所的数据(值为 1-20)。有人知道如何像在其他统计软件包中一样在 R 中通过诊所运行这个模型吗?
我正在尝试使用tapply()
函数按几个类别运行模型,但没有太多成功。我的数据有 20 个诊所,我想按每个诊所运行模型。
这是我的模型:
attach(qregdata)
rq(logA~ dose+ chtcm + cage +raceth + sex,tau=.9)
我作为可变诊所的数据(值为 1-20)。有人知道如何像在其他统计软件包中一样在 R 中通过诊所运行这个模型吗?
完成此操作的一种非常通用的方法如下所示。该ddply
函数为每个 运行提供的函数(在本例中lm
)clinic
。您还可以在更复杂的数据横截面上运行它。例如.(clinic,level)
,将对clinic
和的每个组合运行一个单独的模型level
。该术语lm(y~x)$coef[1]
得到线性模型的截距。我认为没有简单的方法可以一次保存每个模型拟合的所有输出。
n <- 10
clinic <- factor(rep(1:3,each=n))
x <- rep(0:(n-1),3)
y <- rnorm(3*n)*x
d <- data.frame(clinic,x,y)
# plot data and linear fits
library(ggplot2)
ggplot(d,aes(x,y)) + geom_point() + facet_wrap(~clinic) + stat_smooth(method='lm')
# run a separate model for each clinic
library(plyr)
ddply(d,.(clinic),summarize,intercept=lm(y~x)$coef[1],slope=lm(y~x)$coef[2])
您可以在诊所的唯一值中使用“lappy”,并使用子集来提取该诊所的数据集部分。然后将模型拟合到子集。
这将返回一个模型列表,然后您可以对其进行进一步处理。
我最近遇到了类似的问题,想分享一下,以防有人仍然对这个话题感兴趣;抱歉挖了一个旧帖子。
tapply
当输入对象(被“拆分”的对象)是向量时,使用起来非常方便。如果要拆分的输入对象是一个矩形数据集,则使用(在这种情况下恰当地命名)函数会简单得多,它是用于对象by
的方便包装器。函数的返回对象属于可以使用参数简化为 a或 a的类。tapply
data.frame
by
by
array
list
simplify = TRUE
当然有更有效的方法来执行此操作,但如果您正在寻找类似tapply
的解决方案 -by
就是这样。
这是一个示例,用于在数据集中的萼片宽度“ ”物种lm
上回归花瓣宽度:by
iris
## Load iris data
data(iris)
## Fit a model to each species-specific subset of the data
fitBySpecies <- by(
data = iris,
INDICES = iris$Species,
FUN = function(speciesSubset)
lm(Petal.Width ~ Sepal.Width, data = speciesSubset)
)