我正在生成一个脚本,用于从cats数据集(从-MASS-包中)创建bootstrap样本.
根据Davidson和Hinkley教科书[1],我进行了一个简单的线性回归,并采用了一个基本的非参数程序,用于从iid观察引导,即对重新采样.
原始样本的形式如下:
Bwt Hwt
2.0 7.0
2.1 7.2
...
1.9 6.8
Run Code Online (Sandbox Code Playgroud)
通过单变量线性模型,我们想通过他们的大脑重量来解释猫的重量.
代码是:
library(MASS)
library(boot)
##################
# CATS MODEL #
##################
cats.lm <- glm(Hwt ~ Bwt, data=cats)
cats.diag <- glm.diag.plots(cats.lm, ret=T)
#######################
# CASE resampling #
#######################
cats.fit <- function(data) coef(glm(data$Hwt ~ data$Bwt))
statistic.coef <- function(data, i) cats.fit(data[i,])
bootl <- boot(data=cats, statistic=statistic.coef, R=999)
Run Code Online (Sandbox Code Playgroud)
现在假设存在一个聚类变量cluster = 1, 2,..., 24(例如,每只猫属于一个给定的垃圾).为简单起见,假设数据是平衡的:我们对每个簇有6个观察值.因此,24窝中的每一只由6只猫组成(即n_cluster = 6和n = 144).
可以通过以下方式创建伪cluster变量:
q <- …Run Code Online (Sandbox Code Playgroud) 我定义了一个自定义函数,如下所示:
my.fun = function() {
for (i in 1:1000) {
...
for (j in 1:20) {
...
}
}
return(output)
}
Run Code Online (Sandbox Code Playgroud)
返回一个输出矩阵,output由1000行和20列组成.
我需要做的是重复这个函数说5次并将五个output结果存储到一个全新的矩阵中,比如说final,但不使用另一个for循环(这样可以使代码更清晰,也是因为在第二个时刻我我想尝试并行化这些额外的5次重复).
因此final应该是一个包含5000行和20列的矩阵(这5次重复的基本原理是在我使用的两个for循环中,以及其他函数中sample).
我尝试使用final <- replicate(5, my.fun()),正确计算了五个重复,但后来我必须"手动"将元素放入一个全新的5000 x 20矩阵中......有更好的方式吗?(也许用sapply()?).非常感谢
在处理分层/多级/面板数据集时,采用一个返回可用变量的组内和组间标准差的包可能非常有用。
Stata通过以下命令可以轻松完成以下数据操作
xtsum, i(momid)
Run Code Online (Sandbox Code Playgroud)
我进行了研究,但找不到任何R可以做到这一点的软件包。
编辑:
为了解决问题,分层数据集的示例可能是这样的:
son_id mom_id hispanic mom_smoke son_birthweigth
1 1 1 1 3950
2 1 1 0 3890
3 1 1 0 3990
1 2 0 1 4200
2 2 0 1 4120
1 3 0 0 2975
2 3 0 1 2980
Run Code Online (Sandbox Code Playgroud)
每个母亲(较高级别)有两个或更多儿子(较低级别)的事实给出了“多级”结构。因此,每个母亲都定义了一组观察结果。
因此,每个数据集变量可以在母亲之间和母亲之间或仅在母亲之间变化。birtweigth母亲之间会有所不同,但同一位母亲之间也会有所不同。而是hispanic固定为同一个母亲。
例如,母体内部方差son_birthweigth为:
# mom1 means
bwt_mean1 <- (3950+3890+3990)/3
bwt_mean2 <- (4200+4120)/2
bwt_mean3 <- (2975+2980)/2
# Within-mother variance for birthweigth
((3950-bwt_mean1)^2 + (3890-bwt_mean1)^2 + …Run Code Online (Sandbox Code Playgroud) 我正在研究一个"宽"数据集,现在我想使用一个特定的包(-msSurv-对于非参数多态模型),它需要间隔形式的数据.
我当前的数据集的特征是每个人占一行:
dat <- read.table(text = "
id cohort t0 s1 t1 s2 t2 s3 t3
1 2 0 1 50 2 70 4 100
2 1 0 2 15 3 100 0 0
", header=TRUE)
Run Code Online (Sandbox Code Playgroud)
其中cohort是时间固定的协变量,s1- s3对应于时变协变量s = 1,2,3,4随时间变化的值(它们是个体随时间访问的不同状态).日历时间由定义t1- t3,和的范围是从0到100用于每个单独的.
因此,例如,个体1保持在状态= 1直到日历时间= 50,然后他保持在状态= 2直到时间= 70,并且最后他保持在状态= 4直到时间100.
我想要获得的是"间隔"形式的数据集,即:
id cohort t.start t.stop start.s end.s
1 2 0 50 1 2
1 2 50 70 …Run Code Online (Sandbox Code Playgroud) 几个月前,我在互联网上找到了一个R套件的信息,用于连接R和Excel,反之亦然(基本上做什么xlsx和XLConnect做什么).
但是,与上述两个解决方案的主要区别在于该软件包并未设计为使用JVM(这给我带来了一些麻烦).
我花了很多时间试图找到该包的参考,但没有成功.
你能帮助我吗?非常感谢.
对于我的数据帧的每一行,我目前正在尝试选择所有重复的值等于4,以便将它们设置为"等于"NA.
我的数据框是这样的:
dat <- read.table(text = "
1 1 1 2 2 4 4 4
1 2 1 1 4 4 4 4",
header=FALSE)
Run Code Online (Sandbox Code Playgroud)
我需要获得的是:
1 1 1 2 2 4 NA NA
1 2 1 1 4 NA NA NA
Run Code Online (Sandbox Code Playgroud)
我找到了有关如何消除重复行或列的信息,但我真的不知道如何继续这里..非常感谢任何帮助
这是我正在处理的数据集的一个可重复的小例子:
set.seed(123)
dat <- as.data.frame( cbind(a=1+round(runif(5), 2), b=round(rnorm(5), 2), high_cutoff=round(1+rnorm(5), 1)) )
Run Code Online (Sandbox Code Playgroud)
数据框是:
a b high_cutoff
1.29 -1.69 2.3
1.79 1.24 -0.7
1.41 -0.11 2.7
1.88 -0.12 1.5
1.94 0.18 3.5
Run Code Online (Sandbox Code Playgroud)
我试图通过行检查前两列中是否至少有一个值高于第三列中的correpondig阈值(假设我想存储1,如果这两个值中的任何一个更高那么截止).
在这个例子中,我期望找到的是:
higher_than_cutoff
0
1
0
1
0
Run Code Online (Sandbox Code Playgroud)
我一直在尝试使用以下(错误)代码及其中的一些变体,但没有取得多大成功:
higher_than_cutoff <- apply( dat[, c("a", "b")], 1, function(x) any(x > dat[, "high_cutoff"]) )
Run Code Online (Sandbox Code Playgroud)
能否就如何进行提出一些建议?任何帮助都非常感谢
我的实际数据集由每个数据集的重复测量组成id,其中测量数量可能因人而异.一个简单的例子是:
dat <- data.frame(id = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L))
dat
## id
## 1 1
## 2 1
## 3 1
## 4 1
## 5 1
## 6 1
## 7 2
## 8 2
## 9 3
## 10 3
## 11 3
Run Code Online (Sandbox Code Playgroud)
我试图按变量顺序编号dat行id.结果应该是:
dat
## id s
## 1 1 1
## 2 1 2
## 3 1 3
## 4 1 4
## …Run Code Online (Sandbox Code Playgroud) 我有以下数据帧dat,它在一些行的开头呈现行特定数量的NA:
dat <- as.data.frame(rbind(c(NA,NA,1,3,5,NA,NA,NA), c(NA,1:3,6:8,NA), c(1:7,NA)))
dat
# V1 V2 V3 V4 V5 V6 V7 V8
# NA NA 1 3 5 NA NA NA
# NA 1 2 3 6 7 8 NA
# 1 NA 2 3 4 5 6 NA
Run Code Online (Sandbox Code Playgroud)
我的目标是删除每行开头的所有NA,并左移行值(相应地在移位行的末尾添加NA,以保持其长度不变).
以下代码按预期工作:
for (i in 1:nrow(dat)) {
if (is.na(dat[i,1])==TRUE) {
dat1 <- dat[i, min(which(!is.na(dat[i,]))):length(dat[i,])]
dat[i,] <- data.frame( dat1, t(rep(NA, ncol(dat)-length(dat1))) )
}
}
dat
Run Code Online (Sandbox Code Playgroud)
返回:
# V1 V2 V3 V4 V5 V6 V7 V8
# …Run Code Online (Sandbox Code Playgroud) 假设我有:
a_1 <- 2
a_2 <- 5
a_3 <- 7
my.foo <- function (input) {print(input^2)}
Run Code Online (Sandbox Code Playgroud)
我的目标是传递名称以a_as my.foo()参数开头的所有对象(因此在示例中a_1,a_2和a_3).
以下代码按预期工作:
n <- length(ls(pattern = "a_"))
for (i in 1:n) {
A <- paste("a_",i,sep="")
my.foo(input=eval(parse(text=A)))
}
Run Code Online (Sandbox Code Playgroud)
我的感觉是,这并不是真正的"优雅"......就像"强迫"R用更简单的方式(通过宏变量)做我能用Stata做的事情.
我想知道是否有更直接的方法来解决这个问题.我试图把a_1,a_2并a_3在列表中的对象,然后使用apply功能,但不是很成功.
谢谢,斯特凡诺
假设我有以下本地宏:
loc a = 12.000923
Run Code Online (Sandbox Code Playgroud)
我想获得第一个非零小数的小数位(4在本例中).
有很多方法可以实现这一目标.一种是a作为一个字符串处理并找到以下位置.:
loc a = 12.000923
loc b = strpos(string(`a'), ".")
di "`b'"
Run Code Online (Sandbox Code Playgroud)
从这里可以进一步循环小数并计数,因为我得到第一个非零元素.当然,这似乎不是一个非常优雅的方法.
你能建议一个更好的方法来解决这个问题吗?也许正则表达式?
我试图提高脚本的效率,基本上,我运行一些线性回归,并且对于每个拟合模型,我将估计的系数和标准误差结果存储在先前创建的数据帧中results.
因此,results在存储任何回归系数之前,数据框已经具有所需的尺寸.
此外,i我做的每一次回归:
mod.fit <- plm(y ~ x1 + x2, index="group", sample)
Run Code Online (Sandbox Code Playgroud)
然后我跑:
results[i,1] <- summary(m.fit)$coefficients[1,1]
results[i,2] <- summary(m.fit)$coefficients[2,1]
results[i,3] <- summary(m.fit)$coefficients[1,2]
results[i,4] <- summary(m.fit)$coefficients[2,2]
Run Code Online (Sandbox Code Playgroud)
有没有办法让上述存储步骤更快?
.
我目前正在研究"长"形式的多态分析数据集(每个人观察一行;每个人最多重复测量5次).
这个想法是每个人都可以在时变状态变量 的水平上反复转换s = 1, 2, 3, 4.我所拥有的所有其他变量(此处cohort)都在任何给定的范围内固定id.
经过一些分析,我需要根据访问状态的具体顺序,以"宽"形式重塑数据集.以下是初始长数据的示例:
dat <- read.table(text = "
id cohort s
1 1 2
1 1 2
1 1 1
1 1 4
2 3 1
2 3 1
2 3 3
3 2 1
3 2 2
3 2 3
3 2 3
3 2 4",
header=TRUE)
Run Code Online (Sandbox Code Playgroud)
最后的"宽"的数据集应考虑到访问的状态,记录到新创建的变量的具体各个序列s1,s2,s3,s4,s5,其中s1在第一状态由个别走访等.
根据上面的示例,宽数据集看起来像:
id cohort s1 s2 s3 …Run Code Online (Sandbox Code Playgroud)