1

私は長期的に定期的に収集された気象データを分析しています (ほとんどのデータで 15 ~ 60 分ごと)。気温や日射量の影響には日周期があります。私は、放射線が雲によって遮られていない場合、1 年のうちの任意の日の太陽放射線への平均露出を説明しようとしています。私は数年分のデータにアクセスでき、R に入力したデータをその年の日付に従って平均化できます。雲のない日の平均日射量を説明するために、平均を行う前にいくつかのデータを捨てる必要があります。

どうやらグラフを載せるほどの評判はないようですが、雲のない日の放射パターンのグラフは放物線のような形をしています。曇りの日は、複数のピークを持つ曲線によって識別できます。2 次回帰の R^2 値を使用して、2 種類の曜日を区別できます。

(編集 -- すべての放射線データと日付/時刻は、1 つのテキスト ファイルの 2 つの列で報告されます。以下のデータを日付ごとに分けて、私が分析しようとしているパターンを読者が簡単に確認できるようにしています。データを共有してパターンを表示するためのより洗練された方法を知りません。)

# The following vectors contain the dates and times of the readings, and the
# radiation recorded.
DateTime1<-c("13/10/23 07:00", "13/10/23 08:00", "13/10/23 09:00", "13/10/23 10:00", "13/10/23 11:00", "13/10/23 12:00", "13/10/23 13:00", "13/10/23 14:00", "13/10/23 15:00", "13/10/23 16:00", "13/10/23 17:00", "13/10/23 18:00", "13/10/23 19:00")
Sol.Rad1<-c(0, 68.78761823, 214.961307, 369.733448, 498.7102322, 576.0963027, 601.8916595, 541.7024936, 447.1195185, 352.5365434, 189.1659501, 8.598452279, 0)
DateTime2<-c("13/10/24 07:00", "13/10/24 08:00", "13/10/24 09:00", "13/10/24 10:00", "13/10/24 11:00", "13/10/24 12:00", "13/10/24 13:00", "13/10/24 14:00", "13/10/24 15:00", "13/10/24 16:00", "13/10/24 17:00", "13/10/24 18:00", "13/10/24 19:00")
Sol.Rad2<-c(0, 68.78761823, 214.961307, 369.733448, 498.7102322, 309.544282, 576.0963027, 386.9303525, 464.316423, 326.7411866, 167.6698194, 8.598452279, 0)

# The vector "Centered" is used to represent the time of day with the
# potential peak of radiation as the centered zero value.  This vector allows
# for the quadratic regressions.
Centered<-c( -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6)

# Combine the vectors into data frames; one for each day.
day1<-data.frame(DateTime1,Centered,Sol.Rad1)
day2<-data.frame(DateTime2,Centered,Sol.Rad2)

# Plotting day1 shows the parabolic shape of a cloudless day
plot(day1$Sol.Rad1 ~ day1$Centered)

# Plotting day2 shows differences in the curve (two additional peaks) due to
# cloud cover.
plot(day2$Sol.Rad2 ~ day2$Centered)

# The R^2 values from a quadratic regression of day1 are close to 0.93.
qr1<- lm(day1$Sol.Rad ~ poly(day1$Centered, 2, raw=TRUE))
summary(qr1)

# While the R^2 values from day2 are less than 0.86.
qr2<- lm(day2$Sol.Rad ~ poly(day2$Centered, 2, raw=TRUE))
summary(qr2)

R^2 の違いは、曇りの日と晴れの日を区別する方法として使用できます。より大きなデータ セット内で毎日このプロセスを繰り返す方法を見つけることができれば.

日付と時刻、またはすべての日の放射線測定値が単一の列内で報告される単一のデータ フレームから複数の二次回帰を行う方法はありますか。

理想的には、2 つの列を持つテーブルで終了したいと考えています。1 つの列には年間通算日が含まれ、2 番目の列には 2 次回帰分析からの R^2 値が含まれます。複数の R^2 または調整済みの R^2 のいずれかが機能すると思います (ただし、R^2 の 2 つのバージョンの違いを十分に理解していないため、一方を優先して使用するよう説得することはできませんでした)もう一方。)

二次回帰分析から R^2 値のみを報告する方法や、分析しているデータの日数だけ二次回帰を繰り返す方法がわかりません。私は潜在的に 10 年間のデータを見ているので、単一の表で分析結果を分析して報告できることは、どの日のデータを使用できるかを分類する素晴らしい方法です。

4

1 に答える 1

0

私は次のようにします。

まず、列名を標準化することをお勧めします。

次に、2 つのデータ フレームが を使用してバインドされrbind()ます。

日付をループする必要があるため、その型は次のように変更されていますas.Date()- ループする 2 つの日付を以下に示します。

ループはlapply()複数の一意の日付で実行され、両方を保持するためにデータ フレームが作成されdateますadjusted R squared。複数の説明変数がある場合は、これに依存することをお勧めします。

最後do.call()に、個々の結果をバインドするために使用されます。

# better to standardize column names
day1 <- data.frame(date = DateTime1, center = Centered, sol.rad = Sol.Rad1)
day2 <- data.frame(date = DateTime2, center = Centered, sol.rad = Sol.Rad2)

# bind them in a single data frame
days <- rbind(day1, day2)

# convert into date
days$date <- as.Date(days$date, "%y/%m/%d")
unique(days$date)
#[1] "2013-10-23" "2013-10-24"

# lapply recursive fit lm() and put date and adjusted R sqared in a data frame
# do.call bind them
do.call(rbind, lapply(unique(days$date), function(x) {
  frame <- model.frame(sol.rad ~ poly(Centered, 2, raw = TRUE), data = days[days$date==x,])
  qr <- lm(sol.rad ~ ., data = frame)
  data.frame(date = x, r_sqrd = summary(qr)$adj.r.squared)
}))

#date    r_sqrd
#1 2013-10-23 0.9232707
#2 2013-10-24 0.8293529
于 2015-05-01T07:56:11.333 に答える