0

我正在尝试使用tapply()函数按几个类别运行模型,但没有太多成功。我的数据有 20 个诊所,我想按每个诊所运行模型。

这是我的模型:

attach(qregdata)
rq(logA~ dose+ chtcm + cage +raceth + sex,tau=.9)

我作为可变诊所的数据(值为 1-20)。有人知道如何像在其他统计软件包中一样在 R 中通过诊所运行这个模型吗?

4

3 回答 3

0

完成此操作的一种非常通用的方法如下所示。该ddply函数为每个 运行提供的函数(在本例中lmclinic。您还可以在更复杂的数据横截面上运行它。例如.(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])
于 2013-01-16T20:55:57.483 回答
0

您可以在诊所的唯一值中使用“lappy”,并使用子集来提取该诊所的数据集部分。然后将模型拟合到子集。

这将返回一个模型列表,然后您可以对其进行进一步处理。

于 2013-01-16T21:01:13.883 回答
0

我最近遇到了类似的问题,想分享一下,以防有人仍然对这个话题感兴趣;抱歉挖了一个旧帖子。

tapply当输入对象(被“拆分”的对象)是向量时,使用起来非常方便。如果要拆分的输入对象是一个矩形数据集,则使用(在这种情况下恰当地命名)函数会简单得多,它是用于对象by的方便包装器。函数的返回对象属于可以使用参数简化为 a或 a的类。tapplydata.framebybyarraylistsimplify = TRUE

当然有更有效的方法来执行此操作,但如果您正在寻找类似tapply的解决方案 -by就是这样。

这是一个示例,用于在数据集中的萼片宽度“ ”物种lm上回归花瓣宽度:byiris

## 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)
)
于 2018-10-18T20:26:40.933 回答